在多个索引上搜索数组

时间:2016-09-05 22:33:37

标签: php

给定以下任一数组(它们是从JSON派生的,并且可以使用json_decode()创建),如何找到给定x和{的父数组的第一个键{1}}值没有手动迭代数组?例如,给定x = 1和y = 3,返回1.最后,我希望删除它,但找到它是第一步。

y

Array
(
    [0] => Array
        (
            [x] => 1
            [y] => 2
        )

    [1] => Array
        (
            [x] => 1
            [y] => 3
        )

    [2] => Array
        (
            [x] => 2
            [y] => 2
        )

    [3] => Array
        (
            [x] => 4
            [y] => 2
        )

    [4] => Array
        (
            [x] => 1
            [y] => 4
        )

)

2 个答案:

答案 0 :(得分:3)

array_search将根据文档完成相同的操作:

  

在数组中搜索给定值,并在成功时返回第一个相应的键

$data = [["x" => 1, "y" => 2], 
         ["x" => 1, "y" => 3], 
         ["x" => 2, "y" => 2],
         ["x" => 4, "y" => 2]];
$result = array_search(["x" => 2, "y" => 2], $data);
echo $result;

输出:

2

答案 1 :(得分:1)

遗憾的是,没有迭代数组就无法在数组中搜索值。时间复杂度仍为O(n),因为您在数组中查找值,而在PHP数组中查找键的成本始终为O(1),因为它是哈希查找。您在PHP中用于检查数组值的任何函数仍将具有O(n)的成本。

function getKey($x, $y, $arr)  {

    foreach($arr as $key => $value) {
        if ($x === $value["x"] && $y === $value["y"]) {
            return $key;
        }
    }

}

你也可以更普遍地写这个函数......

function getKey($needle, $haystack)  {

    foreach($haystack $key => $value) {
        if ($needle === $value) {
            return $key;
        }
    }

}

array_search($needle, $haystack, true)的作用相同。但是,区别在于PHP中的["y" => 1, "x" => 3] !== ["x" => 3, "y" => 1]。因此,更具体的功能将始终按预期工作。更一般的功能有关于价值秩序的边缘情况。

当然,重要的是要注意,您可能总是关心strict comparison,在这种情况下,array_search可以正常工作以满足您的需求。