php - отримати числовий індекс асоціативного масиву


154

У мене є асоціативний масив, і мені потрібно знайти числове положення ключа. Я міг би переглядати масив вручну, щоб знайти його, але чи є кращий спосіб вбудувати PHP?

$a = array(
  'blue'   => 'nice',
  'car'    => 'fast',
  'number' => 'none'
);

// echo (find numeric index of $a['car']); // output: 1

Відповіді:


273
echo array_search("car",array_keys($a));

5
Чи гарантує PHP порядок асоціативного масиву?
Кевін Берк

7
@KevinBurke Не збирається її повторно замовляти, якщо ви не використовуєте функцію сортування. Не впевнений, яку саме гарантію ви шукаєте, але це не так, як модель JavaScript, де немає статичного порядку для асоціативних масивів.
Фоско

6
Індекси, задані "array_keys", не обов'язково будуть відповідати індексу початкового масиву. Наприклад, якщо ви змінили масив за допомогою "unset" або ряду інших функцій, в індексі вихідного масиву залишиться пробіл, але array_keys створить новий масив.
SEOF

4
Це НЕ працює, якщо асоціативний масив змішаний, бо array("val1", "val2", "car" => "val3")він видасть 0, що неправильно ...
Xriuk

Чим це відрізняється від відповіді @ quantamSoup?
Містичний


2

  $a = array(
      'blue' => 'nice',
      'car' => 'fast',
      'number' => 'none'
  );  
var_dump(array_search('car', array_keys($a)));
var_dump(array_search('blue', array_keys($a)));
var_dump(array_search('number', array_keys($a)));



2

Незважаючи на те, що відповідь Фоско не є помилковою, слід враховувати такий випадок : змішані масиви. Уявіть, у мене такий масив:

$a = array(
  "nice",
  "car" => "fast",
  "none"
);

Тепер PHP дозволяє такий синтаксис, але у нього є одна проблема: якщо я запускаю код Fosco, я отримую, 0 що для мене неправильно , але чому це відбувається?
Тому що при порівнянні між рядками та цілими числами PHP перетворює рядки в цілі числа (а це на мою думку начебто дурне), тож при array_search()пошуку індексу він зупиняється на першому, оскільки, мабуть, ("car" == 0) це правда .
Якщо встановити array_search()строгий режим, це не вирішить проблему, оскільки тоді array_search("0", array_keys($a))повернеться помилковим, навіть якщо існує елемент з індексом 0.
Тож моє рішення просто перетворює всі індекси з array_keys()рядків і потім правильно їх порівнює:

echo array_search("car", array_map("strval", array_keys($a)));

Друкує 1, що правильно.

EDIT:
Як вказував Шаун у коментарі нижче, те саме стосується значення індексу, якщо вам трапляється шукати такий індекс, як цей:

$a = array(
  "foo" => "bar",
  "nice",
  "car" => "fast",
  "none"
);
$ind = 0;
echo array_search($ind, array_map("strval", array_keys($a)));

Ви завжди отримаєте 0, що неправильно, тому рішенням було б передати індекс (якщо ви використовуєте змінну) на такий рядок:

$ind = 0;
echo array_search((string)$ind, array_map("strval", array_keys($a)));

1
При передачі змінної слід також надати її як рядок, оскільки передача нуля асоціативному масиву матиме такий же негативний ефект. Наприклад: var_dump(array_search(0, array_map("strval", array_keys($a))));завжди буде вихід int (0), а не bool (false).
Шон Кокерілл

@ShaunCockerill правильно! Оновили свою відповідь, дякую, що вказали на це!
Крюк

0

рішення, яке я придумав ... напевно, досить неефективне порівняно з рішенням Фоско:

 protected function getFirstPosition(array$array, $content, $key = true) {

  $index = 0;
  if ($key) {
   foreach ($array as $key => $value) {
    if ($key == $content) {
     return $index;
    }
    $index++;
   }
  } else {
   foreach ($array as $key => $value) {
    if ($value == $content) {
     return $index;
    }
    $index++;
   }
  }
 }

2
Так, PHP має тисячі вбудованих функцій чомусь. Це , як правило , набагато швидше , ніж еквівалентні логіки виписаних довгого шляху в PHP коді.
Білл Карвін

3
Це, мабуть, швидше, ніж array_searchце робиться спочатку, і це болісно уповільнює.
Alasdair

Ах, але вбудований код заздалегідь компілюється, і пошук, швидше за все, буде двійковим пошуком (припускаючи, що він спочатку сортує елементи).
SEOF

0

Усі рішення, засновані на array_keys, не працюють для змішаних масивів. Рішення просте:

echo array_search($needle,array_keys($haystack), true);

З php.net: Якщо для третього параметра строго встановлено значення TRUE, функція array_search () буде шукати однакові елементи в копиці сіна. Це означає, що він також буде проводити суворе порівняння голки в копиці сіна, а предмети повинні бути однаковими.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.