2016-09-05 6 views
0

Для любого из следующих массивов (они получены из JSON и могут быть созданы с использованием json_decode()), как я могу найти первый ключ родительского массива для заданного значения x и y без использования вручную итерации по массиву? Например, если заданы 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

Wow, я никогда не знал '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)) 'возвращает' false'? – user1032531

1

Невозможно найти значение в массиве без итерации по массиву, к сожалению. Сложность по времени все еще O(n), потому что вы ищете значение внутри массива, тогда как стоимость поиска ключа всегда равна O(1) в массиве PHP, потому что это хэш-поиск. Любая функция, которую вы используете в 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). Однако различие заключается в том, что ["y" => 1, "x" => 3] !== ["x" => 3, "y" => 1] в PHP. Поэтому, если более конкретная функция будет работать так, как ожидалось. Более общая функция имеет крайний случай заботы о порядке в стоимости.

Конечно, важно отметить, что вы не можете всегда забота о strict comparison, в этом случае array_search может работать нормально для ваших нужд.

+0

Но не 'array_search()' делает это на более эффективном более низком языке? – user1032531

+0

Они делают то же самое. Независимо от того, эффективен ли кто-либо более эффективный, чем другой, все еще не видно и, вероятно, ничтожно. Я бы больше заботился о правильности эффективности. Различия в производительности здесь спорны. Выполнение неправильной вещи * очень быстро * хуже, чем делать правильную вещь немного медленнее. – Sherif

+0

Я согласен с тем, что это незначительно, однако, если «одна функция может это сделать, вероятно, его следует использовать. Кроме того, всегда нравится изучать новые способы сделать что-то. Спасибо – user1032531

Смежные вопросы