array_intersect_key Sortierung
Henry
- php
Hallo,
ich nehme mal der Einfachheit wegen das Beispiel aus dem Manual:
<?php
$array1 = array('blau' => 1, 'rot' => 2, 'grün' => 3, 'violett' => 4);
$array2 = array('grün' => 5, 'blau' => 6, 'gelb' => 7, 'türkis' => 8);
var_dump(array_intersect_key($array1, $array2));
?>
erzeugt:
array(2) {
["blau"]=> int(1)
["grün"]=> int(3)
})
Ich hätte aber gerne die Reihenfolge aus dem Sucharray als Ausgabe:
array(2) {
["grün"]=> int(3)
["blau"]=> int(1)
})
Also dass das Augabearray sich an die Reihenfolge des sucharrays hält, nicht jetzt nur umgekehrt. Klar, kann ich natürlich alles manuell umstricken, aber möchte mich nachher nicht ärgern, wenn doch ein Funktion bereits dafür vorgesehen ist. Weiss jemand was dazu oder einen simplen Trick?
Gruss
Henry
Hallo Henry,
die Doku macht keine Aussage zur Reihenfolge des Ergebnis-Array. Ob es die Reihenfolge aus dem ersten übergebenen Array ist, ist ein Implementierungsdetail.
Wenn du die Key-Reihenfolge aus Array 2 und die Werte aus Array 1 garantiert haben willst, scheint Handarbeit angesagt.
Rolf
Hello,
steht genauso im Manual
Wenn Du es anders herum haben möchtest, musst Du die beiden Funktionsargumente $array1 und $array2 vertauschen. Dann bekommst Du die anderen Werte in der Reihenfolge der Keys, wie sie dazugehören.
Glück Auf
Tom vom Berg
Hallo TS,
das ist zu einfach. Ich habe es so verstanden, dass er die Werte aus dem ersten Array und die Reihenfolge aus dem zweiten Array will.
Vertauschen würde auch wieder auf eine undokumentierte Eigenschaft (Reihenfolge der Ergebniskeys) der Funktion zurückgreifen. So was kann zu bösen Fehlern beim Wechsel der PHP Version führen. Es gibt zwar einen 8 Jahre alten Kommentar, der auf die Reihenfolge hinweist, aber Userkommentare sind für mich nicht Kanon.
Rolf
Hallo Rolf,
Vertauschen würde auch wieder auf eine undokumentierte Eigenschaft (Reihenfolge der Ergebniskeys) der Funktion zurückgreifen. So was kann zu bösen Fehlern beim Wechsel der PHP Version führen. Es gibt zwar einen 8 Jahre alten Kommentar, der auf die Reihenfolge hinweist, aber Userkommentare sind für mich nicht Kanon.
Würde in meinem Fall auch nicht gehen, weil die realen Arrays unterschiedlich lang sind. genauer hat das Mutterarray 20 Einträge, ohne key also indexiert, das zweite array enthält als Wert die benötigten indexe der mutter, aber nur 5 Stück, und die sollen dann in richtiger Reihenfolge laufen. Noch genauer, Adressen zb. array2 enthält zb. [0] => 3 , das bedeutet ich benötige aus dem mutterarray als Erstes den 4. Eintrag (fängt ja auch bei null an). Am Ende muss ich also Reihenfolge Vorname, Name usw... alles in der richtigen Reihenfolge haben. Aber deine Antwort hat ja schon geholfen, so mache ich es nun eben doch manuell und lasse noch eine schleife laufen um da zuzuordnen. Wollte eben nur wissen, ob das nötig ist.
Danke übrigens.
Gruss
Henry
Hallo Henry,
Noch genauer, Adressen zb. array2 enthält zb. [0] => 3 , das bedeutet ich benötige aus dem mutterarray als Erstes den 4. Eintrag
Also diese Logik bekommst du mit einer intersect-Funktion niemals hin. Die vergleichen Keys oder Values, oder auch Key+Value. Du brauchst aber einen Match zwischen Value aus array2 und Key aus dem Mutterarray.
Was Du hier hast ist eine Art Pointerliste, da würde ich am ehesten nach array_map schielen und im Callback den Wert zum Eintrag in Array2 aus dem Mutterarray holen.
Rolf