PHP: поиск в двумерном массиве, но поиск только по определенному ключу

1

Я хочу выполнить поиск через 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');

Я уверен, есть еще одно решение. Есть идеи?

Теги:
arrays

3 ответа

4
Лучший ответ

Вот один из способов, который возвращает один ключ:

$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)
  • 0
    Здесь есть небольшая опечатка: array_map (function ($ v) {return $ v ['value'];}, $ array)
  • 0
    Да, отредактировано. Благодарю.
2

Ваш код работает нормально, поэтому этот код просто делает это в меньшем количестве строк. Работает только для 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];
}
2

Приведенные ниже функции возвращают позицию первого вхождения:

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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню