Подтвердить что ты не робот

Использование array_search для многомерного массива

Использование array_search в 1-мерном массиве прост

$array = array("apple", "banana", "cherry");
$searchValue = "cherry";
$key = array_search($searchValue, $array);

echo $key;

но как насчет многомерного массива?

    #RaceRecord

    [CarID] [ColorID] [Position]
[0]    1        1         3
[1]    2        1         1
[2]    3        2         4
[3]    4        2         2
[4]    5        3         5

например, я хочу получить индекс автомобиля, позиция которого равна 1. Как мне это сделать?

4b9b3361

Ответ 1

function find_car_with_position($cars, $position) {
    foreach($cars as $index => $car) {
        if($car['Position'] == $position) return $index;
    }
    return FALSE;
}

Ответ 2

В php 5.5.5 и более поздних версиях вы можете попробовать это

$array_subjected_to_search =array(
array(
        'name' => 'flash',
        'type' => 'hero'
    ),

array(
        'name' => 'zoom',
        'type' => 'villian'
    ),

array(
        'name' => 'snart',
        'type' => 'antihero'
    )
);
$key = array_search('snart', array_column($array_subjected_to_search, 'name'));
var_dump($array_subjected_to_search[$key]);

Выход:

array(2) { ["name"]=> string(5) "snart" ["type"]=> string(8) "antihero" }

рабочий образец: http://sandbox.onlinephpfunctions.com/code/19385da11fe0614ef5f84f58b6dae80bd216fc01

Документацию по array_column можно найти здесь

Ответ 3

Вы можете попробовать это

array_search(1, array_column($cars, 'position'));

Ответ 4

Ура для однострочников!

$index = array_keys(array_filter($array, function($item){ return $item['property'] === 'whatever';}))[0];

Давайте сделаем это более понятным:

array_filter(
    $array, 
    function ($item) {
        return $item['property'] === 'whatever';
    }
); 

возвращает массив, который содержит все элементы, которые удовлетворяют условию в обратном вызове, сохраняя при этом свои оригинальные ключи массива. Нам в основном нужен ключ первого элемента этого массива.

Для этого мы оборачиваем результат в array_keys() и получаем его первым элементом. Этот конкретный пример предполагает, что существует хотя бы один соответствующий элемент, поэтому вам может потребоваться дополнительная проверка, чтобы быть в безопасности.

Ответ 5

Я в основном "воссоздал" underscore.js findWhere метод, который должен умереть за.

Функция:

function findWhere($array, $matching) {
    foreach ($array as $item) {
        $is_match = true;
        foreach ($matching as $key => $value) {

            if (is_object($item)) {
                if (! isset($item->$key)) {
                    $is_match = false;
                    break;
                }
            } else {
                if (! isset($item[$key])) {
                    $is_match = false;
                    break;
                }
            }

            if (is_object($item)) {
                if ($item->$key != $value) {
                    $is_match = false;
                    break;
                }
            } else {
                if ($item[$key] != $value) {
                    $is_match = false;
                    break;
                } 
            }
        }

        if ($is_match) {
            return $item;   
        }
    }

    return false;
}

Пример:

$cars = array(
    array('id' => 1, 'name' => 'Toyota'),
    array('id' => 2, 'name' => 'Ford')
);

$car = findWhere($cars, array('id' => 1));

или

$car = findWhere($cars, array(
    'id' => 1,
    'name' => 'Toyota'
));

Я уверен, что этот метод может легко уменьшить LOC. Я немного устал.: P

Ответ 6

фактически все функции массива предназначены для одномерного массива. Вам всегда нужно иметь в виду, что вы применяете его в одномерном массиве.

function find_car_with_position($cars, $position) {
    for($i=0;$i<count($cars);$i++){
        if(array_search($search_val, $cars[$i]) === false){
             // if value not found in array.....
        }  
        else{
            // if value is found in array....
        }
    }
}