Другое возможное решение основано на функции array_search()
.Вам необходимо использовать PHP 5.5.0 или выше.
Пример
$userdb=Array
(
(0) => Array
(
(uid) => '100',
(name) => 'Sandra Shush',
(url) => 'urlof100'
),
(1) => Array
(
(uid) => '5465',
(name) => 'Stefanie Mcmohn',
(pic_square) => 'urlof100'
),
(2) => Array
(
(uid) => '40489',
(name) => 'Michael',
(pic_square) => 'urlof40489'
)
);
$key = array_search(40489, array_column($userdb, 'uid'));
echo ("The key is: ".$key);
//This will output- The key is: 2
Объяснение
Функция array_search()
имеет два аргумента.Первый - это значение, которое вы хотите найти.Во-вторых, где функция должна искать.Функция array_column()
получает значения элементов, ключ которых равен 'uid'
.
Сводка
Так что вы можете использовать его как:
array_search('breville-one-touch-tea-maker-BTM800XL', array_column($products, 'slug'));
или, еслиВы предпочитаете:
// define function
function array_search_multidim($array, $column, $key){
return (array_search($key, array_column($array, $column)););
}
// use it
array_search_multidim($products, 'slug', 'breville-one-touch-tea-maker-BTM800XL');
Исходный пример (xfoxawy) можно найти на DOCS .
array_column()
страница .
Обновление
Из-за комментария Ваэля мне было любопытно, поэтому я сделал простой тест, чтобы измерить эффективность метода, использующего array_search
, и метода, предложенного напринятый ответ.
Я создал массив, который содержал 1000 массивов, структура была такой (все данные были рандомизированы):
[
{
"_id": "57fe684fb22a07039b3f196c",
"index": 0,
"guid": "98dd3515-3f1e-4b89-8bb9-103b0d67e613",
"isActive": true,
"balance": "$2,372.04",
"picture": "http://placehold.it/32x32",
"age": 21,
"eyeColor": "blue",
"name": "Green",
"company": "MIXERS"
},...
]
Я 100 раз запускал поисковый тест в поисках разных значений для имениполе, а затем я рассчитал среднее время в миллисекундах . Здесь вы можете увидеть пример.
Результаты показали, что метод, предложенный для этого ответа, требовал около 2E-7, чтобы найти значение, в то время как принятый метод ответа требовал около 8E-7.
Как я уже говорил, оба раза вполне приемлемы для приложения, использующего массив с таким размером.Если размер сильно увеличится, скажем, 1М элементов, то эта небольшая разница также будет увеличена.
Обновление II
Я добавил тест для метода, основанного на array_walk_recursive
, о котором упоминалось в некоторых ответах здесь.Полученный результат является правильным.И если мы сфокусируемся на производительности, то она немного хуже, чем у других, проверенных на тесте .В тесте вы можете увидеть, что это примерно в 10 раз медленнее, чем метод, основанный на array_search
.Опять же, это не очень значимая разница для большинства приложений.
Обновление III
Спасибо @mickmackusa за обнаружение нескольких ограничений этого метода:
- Этот метод не будет работать на ассоциативных ключах.
- Этот метод будет работать только на индексированных подмассивах (начиная с 0 и последовательно восходящих ключей).