PHP: Как добраться до ключа в многомерном массиве? - PullRequest
0 голосов
/ 19 декабря 2009

У меня есть массив как

$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
)

Как получить ключ, указав значение?

например. если я ищу «буйволы», array_search может вернуть «2».

Спасибо

Ответы [ 5 ]

2 голосов
/ 19 декабря 2009
$myArray =array
(
"0"=>array("dogs",98),
"1"=>array("cats",56),
"2"=>array("buffaloes",78)
);

function findInArray($term, $array) {
    foreach($array as $key => $val) {
        if(in_array($term, $val, true)) {
            return $key;
        }
    }
}

echo findInArray('buffaloes', $myArray); // 2
echo findInArray(78, $myArray); // 2
2 голосов
/ 19 декабря 2009

Единственный способ сделать это - выполнить итерацию по каждому элементу и выполнить линейный поиск

$i = -1;
foreach ($myArray as $key => $item){
    if ( $item[0] == 'buffaloes' ){
        $i = $key;
        break;
    }
}
//$i now holds the key, or -1 if it doesn't exist

Как видите, это действительно неэффективно, так как если в вашем массиве 20 000 предметов, а 'буйволы' - последний элемент, вам нужно сделать 20 000 сравнений.

Другими словами, вам нужно изменить структуру данных так, чтобы вы могли что-то искать с помощью ключа, например, лучшим способом может быть перестановка массива так, чтобы в качестве ключа вы искали строку, которую вы ищете, например:

$myArray['buffaloes'] = 76;

Что намного быстрее, поскольку он использует лучшую структуру данных, так что ему нужно только самое большее n log n сравнений (где n - количество элементов в массиве). Это потому, что массив на самом деле является упорядоченной картой.

Другой вариант, если вы знаете точное значение искомого значения, это использовать array_search

2 голосов
/ 19 декабря 2009
function asearch($key, $myArray) {
  for ($i = 0; $i < sizeof($myArray); $i++) {
    if ($myArray[$i][0] == $key) {
      return $i;
    }
  }
  return -1; # no match
}

Хотя вы, вероятно, захотите реструктурировать свой массив в:

$myarray = array(
  'dogs' => 98,
  'cats' => 56,
  'buffaloes' => 78
);

И просто сделай:

$myArray['buffaloes']; # 78
1 голос
/ 19 декабря 2009

Я никогда не слышал о встроенной функции. Если вы хотите что-то более общее, то вышеупомянутые решения вы должны написать свою собственную функцию и использовать рекурсию. может быть, будет полезен array_walk_recursive

1 голос
/ 19 декабря 2009

Вы можете зацикливаться на каждом элементе массива, проверяя, равен ли первый элемент каждой записи "буйволам".

Например:

foreach ($myArray as $key => $value) {
    if ($value[0] == "buffaloes") {
        echo "The key is : $key";
    }
}

Получит ли ты:

The key is : 2


Другая идея (более забавно?) , если вы хотите выполнить целую запись, может заключаться в работе с array_filter и функцией обратного вызова, которая возвращает true для записи "bufalloes":

function my_func($val) {
    return $val[0] == "buffaloes";
}
$element = array_filter($myArray, 'my_func');
var_dump($element);

Получит вас:

array
  2 => 
    array
      0 => string 'buffaloes' (length=9)
      1 => int 78

И

var_dump(key($element));

Даёт вам 2, который вы хотели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...