Ich habe dieses mehrdimensionale Array. Ich muss es suchen und nur den Schlüssel zurückgeben, der dem Wert des "Slugs" entspricht. Ich weiß, dass es andere Themen zum Durchsuchen mehrdimensionaler Arrays gibt, aber ich verstehe nicht genug, um sie auf meine Situation anzuwenden. Vielen Dank für jede Hilfe!
Ich brauche also eine Funktion wie:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Hier ist das Array:
$products = array (
1 => array(
'name' => 'The Breville One-Touch Tea Maker',
'slug' => 'breville-one-touch-tea-maker-BTM800XL',
'shortname' => 'The One-Touch Tea Maker',
'listprice' => '299.99',
'price' => '249.99',
'rating' => '9.5',
'reviews' => '81',
'buyurl' => 'http://www.amazon.com/The-Breville-One-Touch-Tea-Maker/dp/B003LNOPSG',
'videoref1' => 'xNb-FOTJY1c',
'videoref2' => 'WAyk-O2B6F8',
'image' => '812BpgHhjBML.jpg',
'related1' => '2',
'related2' => '3',
'related3' => '4',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => 'K. Martino',
),
2 => array(
'name' => 'Breville Variable-Temperature Kettle BKE820XL',
'slug' => 'breville-variable-temperature-kettle-BKE820XL',
'shortname' => 'Variable Temperature Kettle',
'listprice' => '199.99',
'price' => '129.99',
'rating' => '9',
'reviews' => '78',
'buyurl' => 'http://www.amazon.com/Breville-BKE820XL-Variable-Temperature-1-8-Liter-Kettle/dp/B001DYERBK',
'videoref1' => 'oyZWBD83xeE',
'image' => '41y2B8jSKmwL.jpg',
'related1' => '3',
'related2' => '4',
'related3' => '5',
'bestbuy' => '1',
'quote' => '',
'quoteautor' => '',
),
);
php
search
multidimensional-array
key
Ben Kouba
quelle
quelle
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Eine andere mögliche Lösung basiert auf der
array_search()
Funktion. Sie müssen PHP 5.5.0 oder höher verwenden.Beispiel
Erläuterung
Die Funktion
array_search()
hat zwei Argumente. Der erste ist der Wert, den Sie suchen möchten. Die zweite ist, wo die Funktion suchen sollte. Die Funktionarray_column()
ruft die Werte der Elemente ab, um welche Taste es sich handelt'uid'
.Zusammenfassung
Sie können es also verwenden als:
oder, wenn Sie es vorziehen:
Das Originalbeispiel (von xfoxawy) finden Sie im DOCS .
Die
array_column()
Seite .Aktualisieren
Aufgrund des Kommentars von Vael war ich neugierig und machte einen einfachen Test, um die Leistung der verwendeten Methode
array_search
und die für die akzeptierte Antwort vorgeschlagene Methode zu messen .Ich habe ein Array erstellt, das 1000 Arrays enthielt. Die Struktur war wie folgt (alle Daten wurden zufällig ausgewählt):
Ich habe den Suchtest 100 Mal durchgeführt, um nach verschiedenen Werten für das Namensfeld zu suchen, und dann die mittlere Zeit in Millisekunden berechnet . Hier sehen Sie ein Beispiel.
Die Ergebnisse waren, dass die für diese Antwort vorgeschlagene Methode etwa 2E-7 benötigte, um den Wert zu finden, während die akzeptierte Antwortmethode etwa 8E-7 benötigte.
Wie ich bereits sagte, sind beide Zeiten für eine Anwendung mit einem Array dieser Größe ziemlich akzeptabel. Wenn die Größe stark wächst, sagen wir 1M Elemente, dann wird auch dieser kleine Unterschied größer.
Update II
Ich habe einen Test für die Methode hinzugefügt, der
array_walk_recursive
auf einigen der Antworten hier erwähnt wurde. Das Ergebnis ist das richtige. Und wenn wir uns auf die Leistung konzentrieren, ist sie etwas schlechter als die anderen, die im Test untersucht wurden . Im Test können Sie feststellen, dass dies etwa zehnmal langsamer ist als die darauf basierende Methodearray_search
. Auch dies ist für die meisten Anwendungen kein sehr relevanter Unterschied.Update III
Vielen Dank an @mickmackusa für das Erkennen einiger Einschränkungen dieser Methode:
quelle
array_search()
mitarray_column()
funktioniert nicht im Beispielarray des OP, da die Subarray-Schlüssel von beginnen1
. Diese Methode schlägt auch bei assoziativen Schlüsseln fehl. Diese Methode funktioniert nur bei indizierten Subarrays (ausgehend von0
und mit nacheinander aufsteigenden Schlüsseln). Der Grund dafür ist, dassarray_column()
in seinem zurückgegebenen Array neue Indizes generiert werden.Diese Klassenmethode kann im Array nach mehreren Bedingungen suchen:
Wird herstellen:
quelle
Verwenden Sie diese Funktion:
und Funktion aufrufen.
quelle
quelle
Für den nächsten Besucher: Verwenden Sie den rekursiven Array-Spaziergang. es besucht jedes "Blatt" im mehrdimensionalen Array. Hier ist zur Inspiration:
quelle
Ich möchte unten, wo
$products
ist das tatsächliche Array in dem Problem am Anfang angegeben.quelle
Versuche dies
quelle
&&
und||
anstelle vonAND
undOR
in Ihrem Zustand. Es gibt keinen Grund zu erklärencurrent_key
. Der Vergleich$needle
sollte streng sein.