Wie suche ich nach key = & gt; value in einem mehrdimensionalen Array in PHP
Gibt es eine schnelle Möglichkeit, um alle subarrays, wo ein Schlüssel-Wert-paar gefunden wurde, in einem mehrdimensionalen array? Ich kann nicht sagen, wie tief das array sein wird.
Einfache Beispiel-array:
$arr = array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>2,name=>"cat 2"),
2 => array(id=>3,name=>"cat 1")
);
Wenn ich Suche für key=name und value="Katze 1" die Funktion zurückgeben soll:
array(0 => array(id=>1,name=>"cat 1"),
1 => array(id=>3,name=>"cat 1")
);
Ich denke, die Funktion ist rekursiv, um sich um die tiefste Ebene.
InformationsquelleAutor der Frage | 2009-06-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Code:
Ausgabe:
Wenn Effizienz wichtig ist, dass Sie schreiben könnte, so dass alle rekursiven Aufrufe speichern Ihre Ergebnisse in den gleichen temporären
$results
Arrays statt arrays Zusammenführen zusammen, etwa so:Den key da ist, dass
search_r
nimmt seine vierte parameter per reference anstatt per value; das kaufmännische und-Zeichen&
ist entscheidend.FYI: Wenn Sie eine ältere PHP-version, dann müssen Sie die pass-by-reference-Teil in der nennen zu
search_r
eher als in seiner Erklärung. Das heißt, die Letzte Zeile wirdsearch_r($subarray, $key, $value, &$results)
.InformationsquelleAutor der Antwort John Kugelman
Wie über die SPL version statt? Es sparen Sie einiges an Tipparbeit:
Was toll ist, dass im Grunde der gleiche code Durchlaufen wird ein Verzeichnis für Sie, indem Sie mit einem RecursiveDirectoryIterator statt einer RecursiveArrayIterator. SPL ist der roxor.
Nur bummer über SPL ist, dass es schlecht dokumentiert im Internet. Aber einige PHP-Bücher noch einige nützliche Details, besonders Pro-PHP, und man kann wohl google für mehr info, zu.
InformationsquelleAutor der Antwort jared
Ref: http://php.net/manual/en/function.array-filter.php
InformationsquelleAutor der Antwort Prasanth Bendra
Kam zurück, um dieses update nach für alle brauchen eine Optimierung Tipp auf diese Antworten, besonders John Kugelman tolle Antwort oben.
Seiner veröffentlichten Funktion arbeiten gut, aber ich hatte, um dies zu optimieren, ein Szenario für die Handhabung eines 12 000 row resultset. Die Funktion wurde unter ein ewiges 8 Sekunden zum Durchlaufen aller Datensätze, viiiiiel zu lang.
Ich brauchte einfach die Funktion, um die Suche zu BEENDEN und zurück, wenn die übereinstimmung gefunden wurde. Dh, wenn die Suche nach einem customer_id, wir wissen, wir haben nur eine in der Ergebnismenge, und einmal finden wir die customer_id in
das mehrdimensionale array, wollen wir wieder zurück.
Hier ist die speed-optimierte ( und sehr vereinfacht ) version dieser Funktion, für alle, die in not sind. Im Gegensatz zu anderen version, kann es nur Anfassen nur eine Tiefe von Arrays, nicht recurse und nicht entfernt mit der Zusammenführung mehrerer Ergebnisse.
Dieser brachte die der Aufgabe entsprechen, die 12 000 Datensätze zu 1,5 Sekunden. Noch sehr teuer aber viel vernünftiger.
InformationsquelleAutor der Antwort stefgosselin
A-Moll imporvement auf die schnelle version.
InformationsquelleAutor der Antwort blackmogu
Vorsichtig sein, lineare Suchalgorithmen (die oben genannten sind linear) in mehrere eindimensionale arrays wie haben Sie verschärft die Komplexität, seiner Tiefe steigt die Anzahl der Iterationen, die erforderlich sind, um die traverse des gesamten Arrays. Eg:
nehmen würden, an der maximal 200 Iterationen zu finden, was Sie suchen (wenn die Nadel wurden in [100][1]), mit einem geeigneten Algorithmus.
Lineare algorithmen in diesem Fall führen Sie in O(n) (um die Anzahl der Elemente im array), das ist arm, eine million Einträge (zB ein 1000x100x10 array) dauern würde, im Durchschnitt von 500.000 Iterationen die Nadel zu finden. Auch was passieren würde, wenn Sie sich entschieden haben, ändern Sie die Struktur Ihrer mehrdimensionalen array? Und PHP würde kick out ist ein rekursiver Algorithmus, wenn Ihre Tiefe mehr als 100. Informatik besser machen kann:
Wo immer möglich, verwenden Sie Objekte, statt mehrere eindimensionale arrays:
und anwenden einer benutzerdefinierten comparator-interface und Funktion zu Sortieren, und finden Sie Sie:
Können Sie
uasort()
zu nutzen, um eine benutzerdefinierte Komparator, wenn Sie abenteuerlustig fühlen, sollten Sie implementieren Ihre eigenen Kollektionen für Ihre Objekte, Sortieren und verwalten können (ich habe immer ArrayObject erweitern, um eine such-Funktion zumindest).Sobald Sie sortiert sind (uasort ist O(n log n), die ist so gut wie es geht über beliebige Daten), binäre Suche kann die operation in O(log n) Zeit, dh eine million Einträge dauert nur ~20 Iterationen zu suchen. Soweit ich informiert bin benutzerdefinierte Komparator-binäre Suche ist nicht implementiert in PHP (
array_search()
verwendet Natürliche der Bestellung, welche arbeiten am Objekt-Referenzen nicht Ihre Eigenschaften), würden Sie implementieren müssen, um dieses Ihre selbst wie ich es Tue.Dieser Ansatz ist effizienter (es gibt keine mehr Tiefe) und-noch wichtiger-universal (vorausgesetzt, Sie durchzusetzen Vergleichbarkeit mit Schnittstellen), da die Objekte definieren, wie Sie sortiert sind, so können Sie recyceln, der code unendlich. Viel besser =)
InformationsquelleAutor der Antwort mbdxgdb2
InformationsquelleAutor der Antwort Vitalii Fedorenko
http://snipplr.com/view/51108/nested-array-search-by-value-or-key/
InformationsquelleAutor der Antwort Pramendra Gupta
InformationsquelleAutor der Antwort radhe
Brauchte ich etwas ähnliches, aber die Suche nach mehrdimensionales array nach Wert... ich nahm John B. und schrieb
Ich hoffe, es hilft jemandem 🙂
InformationsquelleAutor der Antwort confiq
Dies ist eine überarbeitete Funktion von der, die John K. geschrieben... ich muss packen nur die Schlüssel im array und nichts über es.
InformationsquelleAutor der Antwort Trevor Lettman
Hier ist die Lösung:
InformationsquelleAutor der Antwort Tristan
Und eine andere version liefert den Schlüssel-Wert aus dem array-element, in dem der Wert gefunden wird (keine Rekursion, optimiert für Geschwindigkeit):
Danke an alle, die hier gepostet.
InformationsquelleAutor der Antwort Darko Hrgovic
InformationsquelleAutor der Antwort Monaem AMINA