Я хочу выполнить поиск через 2-мерный массив, но я хочу только искать в определенном поле во втором измерении. Если он найден, я хотел бы вернуть Ключ. Не нужно идти оттуда, мне нужно только первое появление, но я бы тоже не хотел получать все вхождения.
Массив может выглядеть так:
$array = [
0 => ['value' => 'x', 'foo' => 'bar'],
1 => ['value' => 'y', 'foo' => 'bar'],
2 => ['value' => 'z', 'foo' => 'x'],
];
Теперь моя первая мысль будет примерно такой:
function myCustomArraySearch($array, $searchkey, $searchvalue) {
foreach ($array as $key => $value) {
if ($value[$searchkey] == $searchvalue) {
return $key;
}
}
return false;
}
echo myCustomArraySearch($array, 'value', 'x');
Я уверен, есть еще одно решение. Есть идеи?
Вот один из способов, который возвращает один ключ:
$result = array_search('x', array_column($array, 'value'));
Это вернет несколько ключей:
$result = array_keys(array_column($array, 'value'), 'x');
Если у вас нет PHP> = 5.5.0, необходимого для array_column()
используйте его в этом месте:
array_map(function($v) { return $v['value']; }, $array)
Ваш код работает нормально, поэтому этот код просто делает это в меньшем количестве строк. Работает только для PHP 5. 5+.
function myCustomArraySearch($array, $searchkey, $searchvalue) {
$cols = array_column($array, $searchkey);
$result = array_search($searchvalue, $cols);
return $result;
}
Конечно, если вы хотите вернуть найденный массив, а не только индекс, который вы просто вернете так:
function myCustomArraySearch($array, $searchkey, $searchvalue) {
$cols = array_column($array, $searchkey);
$result = array_search($searchvalue, $cols);
return $array[$result];
}
Приведенные ниже функции возвращают позицию первого вхождения:
1 - Использование foreach
итерации и array_serach
function search1($array, $key, $value) {
foreach ($array as $k => $arr) {
if (array_search($value, $arr) != false) {
return $k;
}
}
return false;
}
2 - Использование array_map
, array_key_exists
и array_search
.
function search2($array, $key, $value) {
$mapped = array_map(function($arr) use ($key, $value) {
return (array_key_exists($key, $arr) && $arr[$key] == $value)
? true
: false;
},
$array);
return array_search(true, $mapped);
}
array_walk_recursive
встроенную функцию php php.net/manual/ro/function.array-walk-recursive.php