У меня есть ассоциативный массив, и мне нужно найти цифровую позицию ключа. Я мог бы перебрать массив вручную, чтобы найти его, но есть ли лучший способ встроить в PHP?
$a = array(
'blue' => 'nice',
'car' => 'fast',
'number' => 'none'
);
// echo (find numeric index of $a['car']); // output: 1
array("val1", "val2", "car" => "val3")
он будет производить0
, что неправильно ...http://php.net/manual/en/function.array-keys.php
источник
источник
источник
Хотя ответ Fosco не является неправильным, есть случай, который нужно рассмотреть с этим: смешанные массивы. Представьте, что у меня есть такой массив:
Теперь PHP допускает такой синтаксис, но у него есть одна проблема: если я запускаю код Fosco, я получаю
0
неправильный код , но почему это происходит?Потому что при выполнении сравнения между строками и целыми числами PHP преобразует строки в целые числа (и это, на мой взгляд, довольно глупо), поэтому при
array_search()
поиске индекса он останавливается на первом, потому что, по-видимому,("car" == 0)
это правда .Установка
array_search()
в строгий режим не решит проблему, потому что тогдаarray_search("0", array_keys($a))
вернет false, даже если элемент с индексом 0 существует.Таким образом, мое решение просто конвертирует все индексы из
array_keys()
в строки и затем сравнивает их правильно:Печатает
1
, что правильно.РЕДАКТИРОВАТЬ:
Как Shaun указал в комментарии ниже, то же самое относится и к значению индекса, если вам случится искать int индекс, как это:
Вы всегда получите
0
, что неверно, поэтому решением будет привести индекс (если вы используете переменную) к строке, подобной этой:источник
var_dump(array_search(0, array_map("strval", array_keys($a))));
всегда будет выводитьint (0)
, а неbool (false)
.решение, которое я придумал ... вероятно, довольно неэффективно по сравнению с решением Fosco:
источник
array_search
, что делает сортировку в первую очередь, и поэтому мучительно медленно.Все решения на основе array_keys не работают для смешанных массивов. Решение простое:
Из php.net: Если третий параметр strict установлен в TRUE, функция array_search () будет искать идентичные элементы в стоге сена. Это означает, что он также выполнит строгое сравнение типов иголки в стоге сена, и объекты должны быть одного экземпляра.
источник