it-swarm.com.ru

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

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

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

// echo (find numeric index of $a['car']); // output: 1
139
n00b
echo array_search("car",array_keys($a));
241
Fosco
$blue_keys = array_search("blue", array_keys($a));

http://php.net/manual/en/function.array-keys.php

34
quantumSoup
function arrayValuePosition($value, $array)
{
    return array_search($value, array_keys($array));
}
2
Andrey Vorobyev

  $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
Asterión

Хотя ответ Fosco не является неправильным, есть случай, который нужно рассмотреть с этим: смешанные массивы. Представьте, что у меня есть такой массив:

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

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

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

Печатает 1, что правильно.

Правка:
Как отметил Шон в комментарии ниже, то же самое относится и к значению индекса, если вы случайно выполнили поиск индекса int следующим образом:

$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
Xriuk

решение, которое я придумала ... вероятно, довольно неэффективно по сравнению с решением Fosco:

 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++;
   }
  }
 }
0
n00b

Все решения на основе array_keys не работают для смешанных массивов. Решение простое:

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

От php.net:Если для третьего параметра строгого параметра установлено значение ИСТИНА, то функция array_search () будет искать идентичные элементы в стоге сена. Это означает, что он также выполнит строгое сравнение типов иголки в стоге сена, и объекты должны быть одного экземпляра. 

0
MrBlc