2016-09-05 107 views
0

给定以下数组(它们是从JSON派生的,并且可以使用json_decode()创建),如何在没有手动的情况下为给定的xy找到父数组的第一个键迭代数组?例如,给定x = 1和y = 3,返回1.最终,我想删除它,但找到它是第一步。在多个索引上搜索数组

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 
     ) 

) 

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

    [1] => stdClass Object 
     (
      [x] => 1 
      [y] => 3 
     ) 

    [2] => stdClass Object 
     (
      [x] => 2 
      [y] => 2 
     ) 

    [3] => stdClass Object 
     (
      [x] => 4 
      [y] => 2 
     ) 

    [4] => stdClass Object 
     (
      [x] => 1 
      [y] => 4 
     ) 

) 
+0

尝试[array_filter()](https://secure.php.net/manual/en/function.array-filter.php) – jedifans

+0

@ jedifans。 'array_filter()'返回已过滤的数组。这将如何帮助? – user1032531

+0

其中键是您需要的索引。当然,您可以过滤掉这些值,这意味着您不需要删除步骤。 – jedifans

回答

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 
+0

哇,我从来不知道'array_search()'可以接受一个数组! – user1032531

+0

@ user1032531数组的值与字符串相同。所以array_search只是在数组中搜索一个值,在你的情况下是一个数组。 – Rizier123

+0

很好的解释。谢谢。知道为什么array_search([2,2],json_decode('[{“x”:1,“y”:2},{“x”:1,“y”:3},{“x”:2, “y”:2},{“x”:4,“y”:2},{“x”:1,“y”:4}]',true))'returns'false'? – user1032531

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

} 

哪个做同样的事情​​。但是,PHP的区别在于["y" => 1, "x" => 3] !== ["x" => 3, "y" => 1]。所以更具体的功能将始终按预期工作。更一般的功能具有关心价值秩序的边缘情况。

当然,需要注意的是,你可能不总是关心strict comparison,在这种情况下array_search可以工作得很好,为您的需要是非常重要的。

+0

但是'array_search()'不是用更高效的低语言来做的吗? – user1032531

+0

他们做同样的事情。无论一个人是否比另一个人更有效率仍有待观察,并且无论如何可能微不足道。我会更关心正确性而不是效率。这里的性能差异没有实际意义。做错事*真的很快*比做正确的事情要慢一些。 – Sherif

+0

然而,我认为它是微不足道的,“如果”一个函数可以做到,它应该可能被使用。此外,总是喜欢学习新的方式来做事。谢谢 – user1032531