2016-09-05 105 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