php - una - cómo convertir valores de matriz de cadena a int?
pasar variable string a int php (10)
Esto es casi 3 veces más rápido que explode()
, array_map()
e intval()
:
$integerIDs = json_decode(''['' . $string . '']'', true);
$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 escribir string. ¿Hay una mejor manera de hacerlo que recorrer el conjunto con un foreach y convertir cada cadena en int?
Mantenlo simple...
$intArray = array ();
$strArray = explode('','', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);
¿Por qué estás buscando otras formas? Looping hace el trabajo sin dolor. Si el rendimiento es su preocupación, puede ir con json_decode ()
. La gente ha publicado cómo usar eso, así que no lo incluyo aquí.
Nota: Al usar == operador en lugar de ===, sus valores de cadena se convierten automáticamente en números (por ejemplo, enteros o dobles) si forman un número válido sin comillas. Por ejemplo:
$str = ''1'';
($str == 1) // true but
($str === 1) //false
Por lo tanto, == puede resolver su problema, es eficiente, pero se romperá si usa === en las comparaciones.
No estoy seguro de si esto es más rápido, pero voltear la matriz dos veces arrojará cadenas numéricas a enteros:
$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode('','', $string)));
var_dump($ids);
Por lo tanto, 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. Entonces, implosioné que obtuvieran la cadena.
$integers = array();
for ($i = 0; $i < 1000000; $i++) {
$integers[] = rand(0, 100);
}
$long_string = implode('','', $integers);
Método 1
Este es el único trazador de líneas de la respuesta de Marcos:
$integerIDs = array_map(''intval'', explode('','', $long_string));
Método 2
Este es el enfoque JSON:
$integerIDs = json_decode(''['' . $long_string . '']'', true);
Método 3
Se me ocurrió esto como una modificación de la respuesta de Mark. Esto todavía está usando la función de explode()
, pero en lugar de llamar a array_map()
de array_map()
estoy usando el bucle foreach
para hacer el trabajo para evitar la sobrecarga que array_map()
podría tener. También estoy analizando con (int)
vs intval()
, pero probé ambos, y no hay mucha diferencia en términos de rendimiento.
$result_array = array();
$strings_array = explode('','', $long_string);
foreach ($strings_array as $each_number) {
$result_array[] = (int) $each_number;
}
Resultados:
Method 1 Method 2 Method 3
0.4804770947 0.3608930111 0.3387751579
0.4748001099 0.363986969 0.3762528896
0.4625790119 0.3645150661 0.3335959911
0.5065748692 0.3570590019 0.3365750313
0.4803431034 0.4135499001 0.3330330849
0.4510772228 0.4421861172 0.341176033
0.503674984 0.3612480164 0.3561749458
0.5598649979 0.352314949 0.3766179085
0.4573421478 0.3527538776 0.3473439217
0.4863037268 0.3742785454 0.3488383293
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 3x del Método 2 como se indica en la respuesta. Resultó que el ciclo foreach
fue el más rápido en mi caso. Hice la evaluación comparativa con Xdebug.
Si tiene una matriz multidimensional, ninguna de las soluciones mencionadas anteriormente funcionará. Aquí está mi solución:
public function arrayValuesToInt(&$array){
if(is_array($array)){
foreach($array as &$arrayPiece){
arrayValuesToInt($arrayPiece);
}
}else{
$array = intval($array);
}
}
Entonces, solo haz esto:
arrayValuesToInt($multiDimentionalArray);
Esto hará una matriz como esta:
[["1","2"]["3","4"]]
se parece a esto:
[[1,2][3,4]
(Esto funcionará con cualquier nivel de profundidad)
Si tienes una matriz como esta:
$runners = ["1","2","3","4"];
Y si quieres convertirlos en enteros y mantenerlos dentro del conjunto, los siguientes deberían hacer el trabajo:
$newArray = array_map( create_function(''$value'', ''return (int)$value;''),
$runners);
Un método alternativo más corto podría ser:
$r = explode('','', $s);
foreach ($r as &$i) $i = (int) $i;
Tiene el mismo rendimiento que el Método 3.
Utilice 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 entero, es más claro:
// if you have your values in the format ''1,2,3,4'', use this before:
// $stringArray = explode('','', ''1,2,3,4'');
$stringArray = [''1'', ''2'', ''3'', ''4''];
$intArray = array_map(
function($value) { return (int)$value; },
$stringArray
);
var_dump($intArray);
La salida será:
array(4) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
int(4)
}
$integerIDs = array_map( ''intval'', array_filter( explode('','', $string), ''is_numeric'' ) );
En la solución de Mark, devolverá array([0]=> int 0)
si intenta analizar una cadena como "prueba".
$integerIDs = array_map(''intval'', explode('','', $string));