Ответ 1
Очень просто:
function myfunction($products, $field, $value)
{
foreach($products as $key => $product)
{
if ( $product[$field] === $value )
return $key;
}
return false;
}
У меня этот многомерный массив. Мне нужно найти его и вернуть только ключ, который соответствует значению "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' => '',
),
);
Очень просто:
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;
}