У меня есть этот многомерный массив. Мне нужно найти его и вернуть только тот ключ, который соответствует значению «slug». Я знаю, что есть и другие темы для поиска в многомерных массивах, но я недостаточно понимаю, чтобы применить его к моей ситуации. Большое спасибо за любую помощь!
Поэтому мне нужна такая функция, как:
myfunction($products,'breville-one-touch-tea-maker-BTM800XL');
// returns 1
Вот массив:
$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
Бен Коуба
источник
источник
if (myfunction($array, 'field', 'value') !== FALSE )) // do something...
Другое возможное решение основано на
array_search()
функции. Вам необходимо использовать PHP 5.5.0 или выше.пример
объяснение
У функции
array_search()
два аргумента. Первое - это значение, которое вы хотите найти. Во-вторых, функция должна искать. Функцияarray_column()
получает значения элементов, у которых есть ключ'uid'
.Резюме
Таким образом, вы можете использовать его как:
или, если хотите:
Исходный пример (от xfoxawy) можно найти в DOCS . Страница .
array_column()
Обновить
Из-за комментария Ваэля мне было любопытно, поэтому я провел простой тест, чтобы проверить производительность метода, который использует,
array_search
и метода, предложенного в принятом ответе.Я создал массив, содержащий 1000 массивов, структура была такой (все данные были рандомизированы):
Я запускал поисковый тест 100 раз, ища разные значения для поля имени, а затем вычислял среднее время в миллисекундах . Здесь вы можете увидеть пример.
Результаты показали, что для метода, предложенного в этом ответе, требуется около 2E-7, чтобы найти значение, в то время как для принятого метода ответа требуется около 8E-7.
Как я уже сказал, оба раза вполне допустимы для приложения, использующего массив такого размера. Если размер сильно вырастет, скажем, 1M элементов, то эта небольшая разница также будет увеличена.
Обновление II
Я добавил тест для метода, в
array_walk_recursive
котором упоминалось в некоторых ответах здесь. Полученный результат правильный. А если акцентировать внимание на производительности, то она немного хуже, чем у других рассмотренных на тесте . В тесте видно, что это примерно в 10 раз медленнее, чем метод на основеarray_search
. Опять же, это различие не очень актуально для большинства приложений.Обновление III
Спасибо @mickmackusa за обнаружение нескольких ограничений этого метода:
источник
array_search()
witharray_column()
не будет работать с образцом массива OP, потому что ключи подмассива начинаются с1
. Этот метод также не работает с ассоциативными ключами. Этот метод будет работать только с индексированными подмассивами (начиная с0
ключей и имеющих последовательно возрастающие ключи). Причина этого в том, чтоarray_column()
в возвращаемом массиве будут генерироваться новые индексы.Этот метод класса может выполнять поиск в массиве по нескольким условиям:
Изготовим:
источник
Используйте эту функцию:
и вызовите функцию.
источник
источник
Для следующего посетителя: используйте рекурсивный обход массива; он посещает каждый «лист» многомерного массива. Вот для вдохновения:
источник
Я бы хотел, чтобы ниже
$products
был фактический массив, указанный в задаче в самом начале.источник
Попробуй это
источник
&&
и||
вместоAND
иOR
в вашем состоянии. Нет причин заявлятьcurrent_key
. Сравнение$needle
должно быть строгим.