使用array_search进行多维数组

Sik*_*eon 27 php arrays multidimensional-array

在1维数组中使用array_search很简单

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

echo $key;
Run Code Online (Sandbox Code Playgroud)

但是多维数组怎么样?

    #RaceRecord

    [CarID] [ColorID] [Position]
[0]    1        1         3
[1]    2        1         1
[2]    3        2         4
[3]    4        2         2
[4]    5        3         5
Run Code Online (Sandbox Code Playgroud)

例如,我想得到位置为1的汽车的索引.我该怎么做?

小智 45

在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]);
Run Code Online (Sandbox Code Playgroud)

工作样本:http://sandbox.onlinephpfunctions.com/code/19385da11fe0614ef5f84f58b6dae80bd216fc01

有关array_column的文档可以在这里找到


Amb*_*ber 32

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

  • SikretMiseon - 是的.@diEcho - 您能想到哪种"更简单"的解决方案不是特定于实现的? (2认同)

HCD*_*INH 18

你可以试试这个

array_search(1, array_column($cars, 'position'));
Run Code Online (Sandbox Code Playgroud)


Lou*_*pax 9

万岁的单行!

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

让我们说清楚一点:

array_filter(
    $array, 
    function ($item) {
        return $item['property'] === 'whatever';
    }
); 
Run Code Online (Sandbox Code Playgroud)

返回一个数组,其中包含满足回调条件的所有元素,同时保留其原始数组键.我们基本上需要该数组的第一个元素的键.

为此,我们将结果包装在一个array_keys()调用中并获取它的第一个元素.此特定示例假设存在至少一个匹配元素,因此您可能需要额外检查以确保安全.


Mic*_*ins 6

我基本上'重新创建'了下划线.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;
}
Run Code Online (Sandbox Code Playgroud)

例:

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

$car = findWhere($cars, array('id' => 1));
Run Code Online (Sandbox Code Playgroud)

要么

$car = findWhere($cars, array(
    'id' => 1,
    'name' => 'Toyota'
));
Run Code Online (Sandbox Code Playgroud)

我确信这种方法可以轻松减少LOC.我有点累了.:P