$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);
devoluciones
array(3) {
[0]=>
string(1) "1"
[1]=>
string(1) "2"
[2]=>
string(1) "3"
}
Necesito que los valores sean de tipo int en lugar de tipo string. ¿Hay una mejor manera de hacer esto que recorrer la matriz con un foreach y convertir cada cadena a int?
Esto es casi 3 veces más rápido que
explode()
,array_map()
yintval()
:fuente
Así que tenía curiosidad sobre el rendimiento de algunos de los métodos mencionados en las respuestas para una gran cantidad de enteros.
Preparación
Simplemente creando una matriz de 1 millón de enteros aleatorios entre 0 y 100. Luego, les imploré que obtuvieran la cadena.
Método 1
Este es el revestimiento de la respuesta de Mark:
Método 2
Este es el enfoque JSON:
Método 3
Se me ocurrió esta como modificación de la respuesta de Mark. Esto todavía está usando la
explode()
función, pero en lugar de llamararray_map()
, estoy usando unforeach
bucle regular para hacer el trabajo para evitar la sobrecargaarray_map()
. También estoy analizando con(int)
vsintval()
, pero probé ambos, y no hay mucha diferencia en términos de rendimiento.Resultados:
El resultado final es el promedio. Parece que el primer método fue un poco más lento para 1 millón de enteros, pero no noté una ganancia de rendimiento 3 veces superior al Método 2 como se indica en la respuesta. Resultó que el
foreach
bucle fue el más rápido en mi caso. He hecho el benchmarking con Xdebug.Editar: ha pasado un tiempo desde que la respuesta se publicó originalmente. Para aclarar, el punto de referencia se realizó en php 5.6.
fuente
array_map(function($v){ return (int)$v; }, $strings_array);
esto es lo que quise decirUse este código con un cierre (introducido en
PHP 5.3
), es un poco más rápido que la respuesta aceptada y para mí, la intención de convertirlo en un número entero es más clara:La salida será:
fuente
En la solución de Mark, volverá
array([0]=> int 0)
si intenta analizar una cadena como "prueba".fuente
No estoy seguro de si esto es más rápido, pero voltear la matriz dos veces arrojará cadenas numéricas a enteros:
fuente
Un método alternativo más corto podría ser:
Tiene el mismo rendimiento que el Método 3.
fuente
Si tienes una matriz como:
Y si desea convertirlos en enteros y mantenerlos dentro de la matriz, lo siguiente debería hacer el trabajo:
fuente
Mi solución es convertir cada valor con la ayuda de la función de devolución de llamada:
fuente
Mantenlo simple...
¿Por qué buscas otras formas? Looping hace el trabajo sin dolor. Si el rendimiento es su preocupación, puede seguir adelante
json_decode ()
. La gente ha publicado cómo usar eso, así que no lo incluyo aquí.Nota: Al usar el operador == en lugar de ===, los valores de su cadena se convierten automáticamente en números (por ejemplo, entero o doble) si forman un número válido sin comillas. Por ejemplo:
Por lo tanto, == puede resolver su problema, es eficiente, pero se romperá si usa === en las comparaciones.
fuente
Si tiene una matriz multidimensional, ninguna de las soluciones mencionadas anteriormente funcionará. Aquí está mi solución:
Entonces, solo haz esto:
Esto hará una matriz como esta:
se parece a esto:
(Esto funcionará con cualquier nivel de profundidad)
fuente
Puede convertir valores en la matriz:
También puede devolver el valor de retorno de la
explode
función a$strings
e iterarlo en lugar de usar otra variable ($ ids).Creo que esta solución es la forma más segura con el mejor rendimiento.
fuente
Estilo PHP 7.4:
fuente
Entrada => '["3", "6", "16", "120"]'
Tipo de conversión que utilicé => (int) $ s;
Salida:
Gracias
fuente