Loop fügt ein Array zweimal zu einem Array hinzu - php, arrays, loops

BEARBEITEN


Selbst wenn ich keine verschachtelte Schleife verwendete, produzierte sieDuplikate. Ich habe schließlich einen dreckigen Fehler gemacht, indem ich den Update-Array-Schlüssel auf den Update-Schlüssel gesetzt habe, so dass mindestens ein Duplikat überschrieben würde ... Ich schwöre, es waren nicht die Daten. Die Update-ID ist mein Primärschlüssel, also gibt es keinen so wie es duplexes in der db gibt, schaue ich auch gleich auf meine db und da sind keine duplikate.

Wie auch immer, keine schöne Lösung, aber ich denke, das hat es gelöst:

   foreach( $L_a_updates as $update ){
if( array_key_exists($update["eventId"], $L_a_events) ){
$L_a_events[ $update["eventId"] ]["updates"][ $update["updateId"] ] = $update;
}
}

Die Antworten unten sind jedoch gut und klar von mehr fähigen Köpfen als meiner im Moment. TGIF.

Ursprüngliche Frage unten


Es ist ein Freitagnachmittag, also ist es wahrscheinlich etwas extrem dumm, aber ich kann das nicht richtig funktionieren lassen.

Ich habe zwei Arrays, $L_a_events und $L_a_updates. Jedes Ereignis kann 0 oder mehr Updates enthalten.Ich hole die Ereignisse von der Datenbank, dann hole ich die Aktualisierungen und führe sie dann durch eine Schleife, um Ereignis-IDs zu vergleichen und die Aktualisierungen ihren Ereignissen hinzuzufügen. Die endgültige Struktur ist also etwas wie:

 Array(
[0] => Array(
["eventId"] => 2,
["message"] => "Some message",
["updates"] => Array(
[0] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
)
)
)
);

Ich führe diese Schleife, um das zu erreichen:

foreach( $L_a_events as $key => $event ){
foreach( $L_a_updates as $update ){
if($update["eventId"] == $event["eventId"]){
$L_a_events[$key]["updates"][] = $update;
}
}
}

Stimmt etwas nicht mit meiner Schleife ?! Das Resultset aus der Datenbank zeigt keine Duplikate. Wenn ich beide Arrays vor dem Ausführen der Schleife drucke, sehen beide gut aus.

Erst nach dieser Schleife wird aus irgendeinem Grund zweimal ein einzelnes Update zu einem Ereignis-Array hinzugefügt. Dies geschieht auch nicht bei jedem Update.

Nach der Schleife, anstelle des obigen Arrays, bekomme ich Folgendes:

 Array(
[0] => Array(
["eventId"] => 2,
["message"] => "Some message",
["updates"] => Array(
[0] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
),
[1] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
)
)
)
);

Antworten:

1 für die Antwort № 1

Sie brauchen dazu nicht zwei verschachtelte foreach-Schleifen. Was Sie tun müssen, ist:

for each update:
if event with this update"s event id exists:
add update to the event"s array entry

Es ist absolut nicht notwendig, alle Ereignisse zu durchlaufen. Sie haben bereits ein Array, das all diese Ereignisse enthält. Alles, was Sie tun müssen, ist sicherzustellen, dass Ihr Event-Array die ID des Ereignisses als Schlüssel verwendet.

In PHP würde das in etwa so aussehen:

foreach ($L_a_updates as $update) {
$key = $update["event_id"];
if (array_key_exists($key, $L_a_events)) {
$L_a_events[$key]["updates"][] = $update;
}
}

1 für die Antwort № 2

Es scheint mir sehr ineffizienter Code zu sein, obwohl ich nicht sehen kann, was das Problem ist. Es wäre schön, wenn der Schlüssel der $ L_a_events die eventId wäre, dann könnten Sie mit den Updates beginnen, die Sie hinzufügen müssen:

foreach ($L_a_updates as $update) {
$eventId = $update["eventId"];
$L_a_events[$eventId]["updates"][] = $update;
}

Das wäre so viel einfacher und schneller. Die Annahme ist, dass ein Ereignis existiert, wenn Sie ein Update dafür haben. Sie könnten sogar ein bisschen Code schreiben, um es so zu machen:

foreach ($L_a_events => $event)
{
$eventId = $event["eventId"];
$newEvents[$eventId] = $event;
}

Und verwende $ newEvents statt $ L_a_events. Jetzt haben Sie keine verschachtelten Loops mehr.


0 für die Antwort № 3

Ihr Code ist funktional. Es ist sowieso nicht optimal wie in den vorherigen Antworten. Überprüfen Sie Ihre Daten.

<?php

$L_a_events = array(0=>array("eventId"=>1),1=>array("eventId"=>2));
$L_a_updates = array(0=>array("updateId"=>1,"eventId"=>1),1=>array("updateId"=>2,"eventId"=>1),2=>array("updateId"=>3,"eventId"=>2));

foreach( $L_a_events as $key => $event ){
foreach( $L_a_updates as $update ){
if($update["eventId"] == $event["eventId"]){
$L_a_events[$key]["updates"][] = $update;
}
}
}
print_r($L_a_events);

?>

Ausgabe:

Array
(
[0] => Array
(
[eventId] => 1
[updates] => Array
(
[0] => Array
(
[updateId] => 1
[eventId] => 1
)

[1] => Array
(
[updateId] => 2
[eventId] => 1
)

)

)

[1] => Array
(
[eventId] => 2
[updates] => Array
(
[0] => Array
(
[updateId] => 3
[eventId] => 2
)

)

)

)