PHP-Array in Array erstellen

tklustig

Erfahrenes Mitglied
Hallo Leute,
folgender Code ergibt folgender var_dump()
PHP:
        $articleRoot = $this->filename;
        $xmlDataRoot = array();
        $arItems2BeUsedAssigningCategories = array();
        $arSeveralItems = array();
        $arIndizies = array();
        $xml = simplexml_load_file($articleRoot, 'SimpleXMLElement', LIBXML_NSCLEAN);
        //ierate about XML File
        foreach ($xml->row as $item) {
            $xmlDataRoot[] = $item;

        }
        for ($i = 0; $i < count($xmlDataRoot); $i++) {
            $arItems2BeUsedAssigningCategories[$i]['product_number'] = $xmlDataRoot[$i]->product_number->__toString();
            $arItems2BeUsedAssigningCategories[$i]['name'] = $xmlDataRoot[$i]->name->__toString();
        }
        for ($i = 0; $i < count($arItems2BeUsedAssigningCategories) - 1; $i++) {
            if ($arItems2BeUsedAssigningCategories[$i]['product_number'] === $arItems2BeUsedAssigningCategories[$i + 1]['product_number']) {
                $arSeveralItems[] = array(
                    "product_number" => $arItems2BeUsedAssigningCategories[$i + 1]['product_number'],
                    "name"           => $arItems2BeUsedAssigningCategories[$i + 1]['name']
                );
                $arIndizies[] = $i;
            }
        }
        for ($i = 0; $i < count($arIndizies); $i++) {
            unset($arItems2BeUsedAssigningCategories[$arIndizies[$i]]);
        }
        $arItems2BeUsedAssigningCategories=array_values($arItems2BeUsedAssigningCategories);
        dd($arSeveralItems);

Var_dump():
1726820649148.png

Ich möchte, dass all diejenigen name Werte die für dieselbe Produktnummer hinterlegt sind, in ein neues Array gepackt werden, in der Form:"product_number" => "90000" "name"=>"NADELN U. KLAMMERN U. ZANGEN","ABRISSFOLIE","TRANSPORT U. AUFBEWAHRUNG" etc.etc.,"product_number" => "90001", "name"=>"PAPIERPRODUKTE"etc.etc..)
Die Anzahl der Elemente im neuen assoziativen Array ist dann natürlich wesentlich kleiner als ein
PHP:
count($arSeveralItems);
Wie bekomme ich das am elegantesten hin? Vorab vielen Dank für jedwelche Hilfestellungen!
 

Anhänge

  • 1726820642684.png
    1726820642684.png
    19,7 KB · Aufrufe: 2
Zuletzt bearbeitet:
Würden die Daten so in einer Datenbank stehen, wäre das ein simples SQL-SELECT-Statement.

Von Hand ist das in der Regel zwei ineinander verschachtelte Schleifen.

Ansatz:
Laufe in einer ersten Schleife durch den DataRoot, und sammle nur die EINDEUTIGEN ProductNumbers.
In deinem Beispiel hätte das resultierende Array zwei Elemente.
In einer zweiten Schleife (geschachtelt mit einer inneren Schleife) sammelst du dann die "name"-Werte aus der inneren Schleife die zur ProductNumber der äusseren Schleife passen
 
Würden die Daten so in einer Datenbank stehen, wäre das ein simples SQL-SELECT-Statement.

Von Hand ist das in der Regel zwei ineinander verschachtelte Schleifen.

Ansatz:
Laufe in einer ersten Schleife durch den DataRoot, und sammle nur die EINDEUTIGEN ProductNumbers.
In deinem Beispiel hätte das resultierende Array zwei Elemente.
In einer zweiten Schleife (geschachtelt mit einer inneren Schleife) sammelst du dann die "name"-Werte aus der inneren Schleife die zur ProductNumber der äusseren Schleife passen
Der DataRoot sollte nicht verändert werden. Ich benötige ihn so, wie er ist. Verändert werden sollte nur das Array $arSeveralItems: Außerdem ist der Ansatz unperformant, da es wesentlich mehr Elemente als nur 2 in der ersten Schleife gäbe...
 
Zuletzt bearbeitet:
Hier ist die Lösung, die sich nur auf erwähntes Array arSeveralItems bezieht:
PHP:
$arNumberWithSeveralItems = array();
foreach ($arSeveralItems as $item) {
    $productNumber = $item['product_number'];
    $name = $item['name'];
    if (!isset($arNumberWithSeveralItems[$productNumber])) {
         $arNumberWithSeveralItems[$productNumber] = array();
     }
     $arNumberWithSeveralItems[$productNumber][] = $name;
}
dd($arNumberWithSeveralItems);

hier ist der var_dump(), wie er sein sollte:
1726837777313.png
 
Zuletzt bearbeitet:
Ich würde ein ass. Array anlegen mit product_number als Schlüssel. Dort dann die Name-Wert-Paare als Array eintragen. Hinterher mit array_keys die Schlüssel entfernen.
Aber wäre ein Array mit product_number als Schlüssel und nur den Werten darin nicht besser?
 
"Aber wäre ein Array mit product_number als Schlüssel und nur den Werten darin nicht besser?!
So ist es doch: Ein assozatives Array, wobei die Produktnummer der Schlüssel ist und die Werte als zusätzliches Array bereit stehen, so dass ich mit
PHP:
foreach($arNumberWithSeveralItem as $item=>$key){
    var_dump($key);
    dd($item);
}
alles auslesen kann. Selbstverständlich sind Codeoptimierungen immer willkommen. Wie würdest Du es machen? Codeumformungen welcome!
Mir ist derzeit auch unklar, warum es Array gibt, die nur ein Element enthalten. Das dürfte eigentlich gar nicht sein, da ich im ersten Codelisting nur diejenigen
Werte in $arSeveralItems verfrachte, die mindestens zweimal auftreten. Oder muss durch folgenden Code beide Elemente integriert werden?
PHP:
 for ($i = 0; $i < count($arItems2BeUsedAssigningCategories) - 1; $i++) {
            if ($arItems2BeUsedAssigningCategories[$i]['product_number'] === $arItems2BeUsedAssigningCategories[$i + 1]['product_number']) {
                $arSeveralItems[] = array(
                    "product_number" => $arItems2BeUsedAssigningCategories[$i + 1]['product_number'],
                    "name"           => $arItems2BeUsedAssigningCategories[$i + 1]['name']
                );
$arSeveralItems[] = array(
                    "product_number" => $arItems2BeUsedAssigningCategories[$i]['product_number'],
                    "name"           => $arItems2BeUsedAssigningCategories[$i ]['name']
                );
                $arIndizies[] = $i;
            }
        }
 
Zuletzt bearbeitet:
Jetzt hatte ich Zeit, mir deine Postings genauer anzusehen und in deinem Posting #4 hast Du ja schon genau die Lösung, die mir auch vorschwebte. Du schriebst:
hier ist der var_dump(), wie er sein sollte:
Das hatte ich so missverstanden, dass es ein Wunsch war, den Du nicht realisieren konntest.
 
Zurück