Mam tę wielowymiarową tablicę. Muszę go przeszukać i zwrócić tylko klucz pasujący do wartości „slug”. Wiem, że istnieją inne wątki dotyczące wyszukiwania wielowymiarowych tablic, ale nie jestem wystarczająco zrozumiały, aby zastosować się do mojej sytuacji. Bardzo dziękuję za pomoc!
Więc potrzebuję funkcji takiej jak:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Oto tablica:
$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
źródło
źródło
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Innym możliwym rozwiązaniem jest
array_search()
funkcja. Musisz używać PHP 5.5.0 lub nowszego.Przykład
Wyjaśnienie
Funkcja
array_search()
ma dwa argumenty. Pierwsza to wartość, którą chcesz przeszukać. Drugi to miejsce, w którym funkcja powinna szukać. Funkcjaarray_column()
pobiera wartości elementów, których jest klucz'uid'
.Podsumowanie
Możesz więc użyć go jako:
lub jeśli wolisz:
Oryginalny przykład (autorstwa xfoxawy) można znaleźć na DOCS . Strona .
array_column()
Aktualizacja
Ze względu na komentarz Vael byłem zaciekawiony, więc wykonałem prosty test, aby sprawdzić działanie metody, której używa,
array_search
i metody zaproponowanej na zaakceptowanej odpowiedzi.Stworzyłem tablicę zawierającą 1000 tablic, struktura była następująca (wszystkie dane były losowe):
Przeprowadziłem test wyszukiwania 100 razy, szukając różnych wartości dla pola nazwy, a następnie obliczyłem średni czas w milisekundach . Tutaj możesz zobaczyć przykład.
Wyniki były takie, że metoda zaproponowana w tej odpowiedzi wymagała około 2E-7, aby znaleźć wartość, podczas gdy zaakceptowana metoda odpowiedzi wymagała około 8E-7.
Jak powiedziałem wcześniej, oba czasy są całkiem do przyjęcia dla aplikacji używającej tablicy o tym rozmiarze. Jeśli rozmiar znacznie wzrośnie, powiedzmy 1 mln elementów, to ta niewielka różnica również się zwiększy.
Aktualizacja II
Dodałem test dla metody, na podstawie
array_walk_recursive
której wymieniono niektóre odpowiedzi tutaj. Otrzymany wynik jest prawidłowy. A jeśli skupimy się na wydajności, jest nieco gorsza niż w przypadku innych badanych w teście . W teście widać, że jest to około 10 razy wolniejsze niż metoda oparta naarray_search
. Ponownie, nie jest to bardzo istotna różnica dla większości aplikacji.Aktualizacja III
Podziękowania dla @mickmackusa za dostrzeżenie kilku ograniczeń tej metody:
źródło
array_search()
witharray_column()
nie zadziała na przykładowej tablicy OP, ponieważ klucze podtablicy zaczynają się od1
. Ta metoda nie powiedzie się również w przypadku kluczy asocjacyjnych. Ta metoda będzie działać tylko na indeksowanych podtablicach (zaczynając od0
i posiadających kolejno rosnące klucze). Powodem tego jest to, żearray_column()
wygeneruje nowe indeksy w zwróconej tablicy.Ta metoda klasy może wyszukiwać w tablicy według wielu warunków:
Będzie produkować:
źródło
Użyj tej funkcji:
i wywołać funkcję.
źródło
źródło
Dla następnego odwiedzającego: użyj rekursywnego spaceru po tablicy; odwiedza każdy „liść” w wielowymiarowej tablicy. Oto inspiracja:
źródło
Chciałbym zrobić to poniżej, gdzie
$products
jest rzeczywista tablica podana w problemie na samym początku.źródło
Spróbuj tego
źródło
&&
i||
zamiastAND
iOR
twoim stanie. Nie ma powodu do deklaracjicurrent_key
. Porównanie$needle
powinno być ścisłe.