$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
возвращается
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Мне нужно, чтобы значения были типа int вместо типа string. Есть ли лучший способ сделать это, чем цикл по массиву с foreach и преобразование каждой строки в int?
Это почти в 3 раза быстрее , чем
explode()
,array_map()
иintval()
:источник
Поэтому мне было интересно узнать о производительности некоторых методов, упомянутых в ответах для большого числа целых чисел.
подготовка
Просто создаю массив из 1 миллиона случайных целых чисел от 0 до 100. Затем я сжал их, чтобы получить строку.
Способ 1
Это один вкладыш из ответа Марка:
Способ 2
Это подход JSON:
Способ 3
Я придумал это как модификацию ответа Марка. Это все еще использует
explode()
функцию, но вместо вызоваarray_map()
я использую обычныйforeach
цикл для выполнения работы, чтобы избежать накладных расходовarray_map()
. Я также разбираюсь с(int)
vsintval()
, но я пробовал оба, и с точки зрения производительности нет большой разницы.Полученные результаты:
Суть в среднем. Похоже, что первый метод был немного медленнее для 1 миллиона целых чисел, но я не заметил 3-кратного увеличения производительности метода 2, как указано в ответе. Оказалось,
foreach
петля была самой быстрой в моем случае. Я сделал сравнительный анализ с Xdebug.Изменить: Прошло много времени с тех пор, как ответ был первоначально опубликован. Чтобы уточнить, тест был сделан в php 5.6.
источник
array_map(function($v){ return (int)$v; }, $strings_array);
это то, что я имел в видуИспользуйте этот код с закрытием (введено в
PHP 5.3
), он немного быстрее, чем принятый ответ, и для меня намерение привести его к целому числу яснее:Выход будет:
источник
В решении Марка вы вернетесь,
array([0]=> int 0)
если попытаетесь разобрать строку, например «test».источник
Не уверен, что это быстрее, но переворачивание массива дважды приведёт числовые строки к целым числам:
источник
Альтернативный более короткий метод может быть:
Он имеет ту же производительность, что и метод 3.
источник
Если у вас есть массив, как:
И если вы хотите преобразовать их в целые числа и оставить в массиве, выполните следующее:
источник
Мое решение заключается в приведении каждого значения с помощью функции обратного вызова:
источник
Будь проще...
Почему вы ищете другие пути? Цикл делает работу без боли. Если производительность вас беспокоит, вы можете пойти с
json_decode ()
. Люди опубликовали, как использовать это, поэтому я не включаю это здесь.Примечание. При использовании оператора == вместо === ваши строковые значения автоматически преобразуются в числа (например, целое или двойное), если они образуют действительное число без кавычек. Например:
Таким образом, == может решить вашу проблему, является эффективным, но сломается, если вы будете использовать === в сравнениях.
источник
Если у вас есть многомерный массив, ни одно из ранее упомянутых решений не будет работать. Вот мое решение:
Затем просто сделайте это:
Это сделает массив следующим образом:
выглядеть так:
(Это будет работать с любым уровнем глубины)
источник
Вы можете конвертировать значения в массиве:
Вы также можете возвращать возвращаемое значение
explode
функции$strings
и повторять его вместо использования другой переменной ($ ids).Я думаю, что это решение - самый безопасный способ с лучшей производительностью.
источник
Стиль PHP 7.4:
источник
Input => '["3", "6", "16", "120"]'
Я использовал преобразование типов => (int) $ s;
Вывод:
Спасибо
источник