Intereting Posts
Рамка SLIM Остановить вызов Не удается подключиться с помощью mysql_connect к базе данных в хостинге ipage.com? чтение содержимого utf-8 из таблицы mysql Zend_Mail_Header_HeaderValue :: isValid недействителен со специальными символами Внедрение SecurityContext в прослушиватель prePersist или preUpdate в Symfony2, чтобы получить пользователя в созданномBy или updatedBy вызывает ошибку круговой ссылки Laravel 5 – Проверить множественный запрос Получение определенной строки из базы данных в yii Как игнорировать дублирующее имя и делать первую букву должны быть кепки с помощью вложенного массива? MVC – малая логика в модели? Преобразование степени, минут, секунд (DMS) в десятичный в PHP Может ли PHP OpenSSL генерировать пары частных / открытых ключей / сертификатов? PHP Upload IF ISSET всегда говорит, что это так? Случайный номер PHP Может ли определение множества констант вызвать проблемы с производительностью или памятью? Функция Imagepng не совсем работает

Поиск многомерных массивов PHP (поиск по определенному значению)

У меня этот многомерный массив. Мне нужно найти его и вернуть только ключ, который соответствует значению «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' => '', ), ); 

Related of "Поиск многомерных массивов PHP (поиск по определенному значению)"

Очень просто:

 function myfunction($products, $field, $value) { foreach($products as $key => $product) { if ( $product[$field] === $value ) return $key; } return false; } 

Другое решение, основанное на использовании, основано на функции 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() .


Обновить

Из-за комментария Vael мне было любопытно, поэтому я сделал простой тест, чтобы оценить эффективность метода, который использует 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.

Как я уже говорил, оба раза довольно восприимчивы к приложению, используя массив с таким размером. Если размер будет расти, скажем, 1M элементов, то эта небольшая разница будет увеличена.

Этот метод класса может искать в массиве по нескольким условиям:

 class Stdlib_Array { public static function multiSearch(array $array, array $pairs) { $found = array(); foreach ($array as $aKey => $aVal) { $coincidences = 0; foreach ($pairs as $pKey => $pVal) { if (array_key_exists($pKey, $aVal) && $aVal[$pKey] == $pVal) { $coincidences++; } } if ($coincidences == count($pairs)) { $found[$aKey] = $aVal; } } return $found; } } // Example: $data = array( array('foo' => 'test4', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test1', 'bar' => 'baz3'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz4'), array('foo' => 'test4', 'bar' => 'baz1'), array('foo' => 'test', 'bar' => 'baz1'), array('foo' => 'test3', 'bar' => 'baz2'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test', 'bar' => 'baz'), array('foo' => 'test4', 'bar' => 'baz1') ); $result = Stdlib_Array::multiSearch($data, array('foo' => 'test4', 'bar' => 'baz1')); var_dump($result); 

Будет производить:

 array(2) { [5]=> array(2) { ["foo"]=> string(5) "test4" ["bar"]=> string(4) "baz1" } [10]=> array(2) { ["foo"]=> string(5) "test4" ["bar"]=> string(4) "baz1" } } 

Я нашел сложную ситуацию с первым ответом (извините, у меня недостаточно репутации, чтобы прокомментировать это).

Когда вы найдете нужное значение, а связанное с ним значение равно 0. Если после этого вы используете условные операторы, не только проверяйте возвращаемое значение, но и введите слишком (идентично).

 $key = myfunction($products, $field, $value); // Good if($key !== FALSE){ } if($key === FALSE){ } // Not Good if($key != FALSE){ } if($key == FALSE){ } 
 function search($array, $key, $value) { $results = array(); if (is_array($array)) { if (isset($array[$key]) && $array[$key] == $value) $results[] = $array; foreach ($array as $subarray) $results = array_merge($results, search($subarray, $key, $value)); } return $results; } 

Попробуй это

 function recursive_array_search($needle,$haystack) { foreach($haystack as $key=>$value) { $current_key=$key; if($needle==$value['uid'] OR (is_array($value) && recursive_array_search($needle,$value) !== false)) { return $current_key; } } return false; }