2016-06-24 4 views
0
<?php 
$array1 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array2 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array3 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array4 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$final_arr = array(); 

$final_arr = array_merge($array1,$array2,$array3,$array4);   

echo count($final_arr); 

?> 

Dies ist der Beispielcode in diesem Ich habe 4 Array mit 2 Elementen in jedem Array. und ich verwende Array_merge() -Funktion, um eindeutige E-Mails in allen Array zu erhalten.php Speicherauspuff Problem beim Zählen von eindeutigen E-Mails von mehreren Arrays.

aber auf diese Weise vergrößere ich die Größe der letzten Array-Variablen, bis kein Array mehr in das endgültige Array zusammengeführt wird, aber das gibt mir das richtige Ergebnis, die eindeutigen E-Mails von allen Arrays.

Im Falle, wenn ich 50 Array und Größe jedes Arrays verwenden 50k Elemente haben.

und wenn ich alle Array in einzelne Variable zusammenführen wird dies Speicherauszug Fehler in PHP erstellen, da große variable Größe.

gibt es eine Möglichkeit, einzigartige E-Mails von allen Array durch einige Vergleich zu zählen, um Speicherauspuff Problem zu überwinden.

+0

Und warum müssen Sie Arrays zusammenführen? –

+0

Jedes Array hat eine E-Mail-ID als Schlüssel und mehrere Arrays konnten dieselbe E-Mail-ID wiederholen, um eindeutige E-Mails aus allen Arrays zu zählen, wenn mehrere Arrays nicht denselben Schlüssel wiederholen und einzigartige E-Mails aus der endgültigen Liste zählen können. @ U_mulder –

+0

Wenn Sie zählen müssen einzigartige E-Mails - zählen Sie sie dann. Warum musst du zusammenführen? –

Antwort

0

Try this:

ini_set('memory_limit', '-1'); 

Es entfernt die Speichergrenze von PHP daher werden Sie nicht über genügend Arbeitsspeicher ausgeführt - altough es sehr nützlich sein, wäre völlig anderen Ansatz, um Ihre Daten zu nehmen, weil die Tatsache, Sie keinen Speicher mehr haben, bedeutet einfach, dass es nicht effektiv ist.

+0

Aber es könnte tatsächlich besser tu haben alle Daten in der Datenbank und führen Sie einige erweiterte MySQL-Abfrage. – Mordor

+0

Könnten Sie mir sagen, ob ich JSON-Array in der Datenbank habe und ich dieselbe Operation ausführen muss, um einzigartige E-Mails aus mehreren Reihen von JSON zu zählen, wie es geht? –

+1

Können Sie erklären, wie Ihre Antwort das/die Problem (e) aus der Frage anspricht? Code-only-Antworten sind nicht sehr nützlich, vor allem für weitere Leser, die auf diesen Beitrag stolpern. Vielen Dank! – Cristik

1

Wenn dies nach mir ginge, würde ich wahrscheinlich einen Hash als assoziatives Array Schlüssel, wie so verwenden:

<?php 
$uniqueEmailInfos=Array(); 
foreach($emailInfos as $emailInfo){ 
$key=Sha1(Json_Encode($emailInfo)); 
$uniqueEmailInfos[$key]=$emailInfo; 
} 
?> 

Sie könnten sogar versuchen, unsetting die Quelle mehr Speicherplatz zu sparen, wie Sie gehen:

Wenn die Schleife abgeschlossen ist, sollte $ uniqueEmailInfos nur eindeutige E-Mail-Einträge enthalten. Dies wäre jedoch wahrscheinlich sehr ineffizient.

Wenn Ihre Schleife bereits schnell/gut ist und Ihr einziges Problem Speicher ist, würde ich stattdessen vorschlagen, die Einstellung "memory_limit" von php.ini stattdessen zu ändern.

+0

aber in diesem auch nicht in der Lage, die Größe von $ uniqueEmailInfos Array zu steuern, bis alle Elemente nicht einmal in diesem Array gespeichert werden. –

+0

Ich bin mir nicht sicher, was Sie meinen, aber im zweiten Code-Snippet wird $ emailInfos kleiner, wenn Sie die Schleife durchlaufen, was hilft, die Speichernutzung zu minimieren. –

+0

Ich versuche die Größe von $ uniqueEmailInfos zu kontrollieren, weil es zu größer wird, bis nicht alle Elemente mindestens einmal hinzugefügt werden. –

3

Ich weiß nicht, wie Ihre Arrays gespeichert sind und wo Sie sie nehmen. Aber wenn Sie benötigen zählen eindeutige E-Mails - dann zählen eindeutige E-Mails, nicht Merge Arrays.

$array1 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array2 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array3 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$array4 = array(
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1'), 
     '[email protected]'=>array('name'=>'username','ip'=>'127.0.0.1') 
     ); 

$unique_emails = array(); 

foreach ($array1 as $email => $v) { 
    if (!isset($unique_emails[$email])) { 
     $unique_emails[$email] = 1; 
    } else { 
     $unique_emails[$email]++; 
    } 
} 

foreach ($array2 as $email => $v) { 
    if (!isset($unique_emails[$email])) { 
     $unique_emails[$email] = 1; 
    } else { 
     $unique_emails[$email]++; 
    } 
} 

// for third and forth arrays the same. 
print_r($unique_emails); 
// outputs Array ([[email protected]] => 2 [[email protected]] => 2 [[email protected]] => 1 [[email protected]] => 3) 
+0

Oh Schatz .. Ich habe das Wort "count" im ursprünglichen Beitrag nicht verstanden. +1 für eine intelligentere Lösung. –

+0

Danke für das Hinzufügen dieser Lösung wird dies definitiv weniger Speicher verwenden, da Sie nur Zähler im Wert Teil während Array_merge() gibt den vollen Wert zurück, die mehr Speicher verbraucht, aber in diesem Fall auch das gleiche Problem auftreten, da $ unique_emails Array-Größe bis alle Array erhöht wird nicht verarbeitet. –

Verwandte Themen