$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
retorna
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Eu preciso que os valores sejam do tipo int em vez do tipo string. Existe uma maneira melhor de fazer isso do que fazer um loop pela matriz com um foreach e converter cada string em int?
Isso é quase 3 vezes mais rápido do que
explode()
,array_map()
eintval()
:fonte
Então, fiquei curioso sobre o desempenho de alguns dos métodos mencionados nas respostas para um grande número de números inteiros.
Preparação
Apenas criando uma matriz de 1 milhão de números inteiros aleatórios entre 0 e 100. Então, eu os implodi para obter a sequência.
Método 1
Este é o argumento da resposta de Mark:
Método 2
Esta é a abordagem JSON:
Método 3
Eu vim com este aqui como modificação da resposta de Mark. Isso ainda está usando a
explode()
função, mas, em vez de chamararray_map()
, estou usando umforeach
loop regular para fazer o trabalho para evitar a sobrecargaarray_map()
. Também estou analisando com(int)
vsintval()
, mas tentei ambos, e não há muita diferença em termos de desempenho.Resultados:
A linha inferior é a média. Parece que o primeiro método foi um pouco mais lento para 1 milhão de números inteiros, mas não notei um ganho de desempenho 3x do Método 2, conforme indicado na resposta. Acabou que o
foreach
loop foi o mais rápido no meu caso. Eu fiz o benchmarking com o Xdebug.Editar: Já faz um tempo desde que a resposta foi postada originalmente. Para esclarecer, o benchmark foi realizado no php 5.6.
fonte
array_map(function($v){ return (int)$v; }, $strings_array);
isto é o que eu quis dizerUse esse código com um fechamento (introduzido em
PHP 5.3
), é um pouco mais rápido que a resposta aceita e, para mim, a intenção de convertê-lo em um número inteiro é mais clara:A saída será:
fonte
Na solução de Mark, você retornará
array([0]=> int 0)
se tentar analisar uma string como "test".fonte
Não tenho certeza se isso é mais rápido, mas inverter a matriz duas vezes converterá seqüências numéricas em números inteiros:
fonte
Um método alternativo mais curto pode ser:
Tem o mesmo desempenho que o método 3.
fonte
Se você tiver uma matriz como:
E se você deseja disfarçá-los em números inteiros e manter-se dentro da matriz, faça o seguinte:
fonte
Minha solução está lançando cada valor com a ajuda da função de retorno de chamada:
fonte
Mantenha simples...
Por que você está procurando outras maneiras? Looping faz o trabalho sem dor. Se o desempenho é sua preocupação, você pode prosseguir
json_decode ()
. As pessoas postaram como usar isso, então não estou incluindo aqui.Nota: Ao usar o operador == em vez de ===, seus valores de sequência são convertidos automaticamente em números (por exemplo, número inteiro ou duplo) se formarem um número válido sem aspas. Por exemplo:
Portanto, == pode resolver seu problema, é eficiente, mas será interrompido se você usar === nas comparações.
fonte
Se você tiver uma matriz multidimensional, nenhuma das soluções mencionadas anteriormente funcionará. Aqui está a minha solução:
Então, faça o seguinte:
Isso criará uma matriz como esta:
parece com isso:
(Isso funcionará com qualquer nível de profundidade)
fonte
Você pode converter valores na matriz:
Você também pode retornar o valor de retorno da
explode
função$strings
e iterá-lo em vez de usar outra variável ($ ids).Eu acho que essa solução é a maneira mais segura e com o melhor desempenho.
fonte
Estilo PHP 7.4:
fonte
Entrada => '["3", "6", "16", "120"]'
Conversão de tipo que usei => (int) $ s;
Resultado:
obrigado
fonte