Поиск многомерного массива 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' => '',
),
);
8 ответов:
очень просто:
function myfunction($products, $field, $value) { foreach($products as $key => $product) { if ( $product[$field] === $value ) return $key; } return false; }
этот метод класса можно искать в массиве по нескольким условиям:
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" } }
использовать эту функцию:
function searchThroughArray($search,array $lists){ try{ foreach ($lists as $key => $value) { if(is_array($value)){ array_walk_recursive($value, function($v, $k) use($search ,$key,$value,&$val){ if(strpos($v, $search) !== false ) $val[$key]=$value; }); }else{ if(strpos($value, $search) !== false ) $val[$key]=$value; } } return $val; }catch (Exception $e) { return false; }}
и вызов функции.
print_r(searchThroughArray('breville-one-touch-tea-maker-BTM800XL',$products));
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; }
для следующего посетителя: используйте рекурсивный массив walk; он посещает каждый "лист" в многомерном массиве. Вот для вдохновения:
function getMDArrayValueByKey($a, $k) { $r = []; array_walk_recursive ($a, function ($item, $key) use ($k, &$r) {if ($key == $k) $r[] = $item;} ); return $r; }
попробуй такое
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; }
Я бы сделал как ниже, где
$products- это фактический массив, заданный в задаче в самом начале.print_r( array_search("breville-variable-temperature-kettle-BKE820XL", array_map(function($product){return $product["slug"];},$products)) );
Comments