2011-05-11 25 views
22

tengo una variable $ v que pueden ser individual cuerda o matriz de cadenas
y tengo un código:Cómo fundido a la matriz variable de

$a = array(); 
if (is_array($v)) { 
    $a = $v; 
} else { 
    $a[] = $v; 
} 

Cómo se puede hacer de forma más elegante? (En otras palabras, cómo convertir una variable de matriz)

Respuesta

42

puede convertir una variable de una matriz en este sentido (aunque no es necesario que en PHP.)

$var = (array)$arr; 

Además, mientras puede hacer lo anterior para configurar la variable $arr en $var y forzarla a ser una matriz, no tiene sentido hacer eso. En PHP, la mayoría de las cosas que podemos llamar "tipos de datos" como programadores son simplemente inexistentes. Cualquier variable puede ser doble, flotante, cadena ... cualquier cosa a la vez. Son casi completamente intercambiables.

Ver: http://php.net/manual/en/language.types.php

+0

esto resultados en php unexpected behavior. la forma correcta es array ($ arr) – Ulterior

+21

La respuesta es correcta. El comentario de @Ulterior no es. Ejemplo: $ arr = null; var_dump ((array) $ arr, array ($ arr)); Devuelve: matriz (0) {} (correcta), luego matriz (1) {[0] => NULA} (incorrecta) También, con respecto a la respuesta correcta de cbroughton, tales conversiones son necesarias cuando la variable tiene que ser utilizado en un foreach(): si la variable no es una matriz (o iterable), habrá una advertencia de PHP. – FGM

+2

FWIW: Creo que es importante encasillar Si alguna vez tiene una variable, está sujeta a una mutación seguida de una función que toma una matriz, p. 'foreach' o' implode'; de lo contrario, se encontrará con advertencias y errores no deseados. – GFargo

16
$a = (array) $v; 

es la respuesta.

+2

Era tan corto que tuve que agregar caracteres de relleno :-P – Kelly

+1

Sé que esta respuesta es bastante antigua, pero ¿no debería ser '$ a = (array) $ v;'? Al menos para el caso del OP. –

3

Como alternativa puede usar settype:

settype($a, "array"); 

Para explicitar el tipo de variable. Es exactamente lo mismo que sucede con un encasillado detrás de escena. (Más útil para grupos sabia encasillamiento por ejemplo, en los bucles.)

6

que iba a escribir su podría fragmento de código como esto (corta y leerlo y saber exactamente lo que está sucediendo):

$a = is_array($v) ? $v : array($v); 
-3

En realidad, si usted quiere para echar a un array y no tener que preocuparse por lo que puso en él, la respuesta es

$var = (is_object($var)) ? array($var) : (array) $var; 

esto se comprueba con el siguiente código

function toArray($var) { 
    return (is_object($var)) ? array($var) : (array) $var; 
} 

$object = new stdClass; 
$resource = fopen('php://stdout', 'w'); 
$closure = function() {}; 

$tests = array(
    array(toArray(true),  array(true),  'boolean true'), 
    array(toArray(false),  array(false),  'boolean false'), 
    array(toArray(null),  array(),   'null'), 
    array(toArray(1),   array(1),   'positive integer'), 
    array(toArray(0),   array(0),   'zero integer'), 
    array(toArray(-1),  array(-1),  'negative integer'), 
    array(toArray(1.5),  array(1.5),  'positive float'), 
    array(toArray(0.0),  array(0.0),  'zero float'), 
    array(toArray(-1.5),  array(-1.5),  'negative float'), 
    array(toArray(''),  array(''),  'empty string'), 
    array(toArray('foo'),  array('foo'),  'string'), 
    array(toArray(array()), array(),   'array'), 
    array(toArray($object), array($object), 'object'), 
    array(toArray($resource), array($resource), 'resource'), 
    array(toArray($closure), array($closure), 'closure'), 
); 

foreach ($tests as $test) { 
    ob_start(); 
    var_dump($test[0]); 
    $a = ob_get_clean(); 
    ob_start(); 
    var_dump($test[1]); 
    $b = ob_get_clean(); 
    assert($a === $b, "{$test[2]} is not the same"); 
} 
+0

En realidad ... esto no es verdad. Puede lanzar objetos a una matriz como '$ var = (array) $ obj;' -> '$ object = new stdClass;' debe ser convertida en 'array()' (matriz vacía) – Philipp

1

Si usted está buscando para convertir un objeto en una sola matriz recuento puede utilizar el código de seguimiento:

$list = array([0] => $obj); 

Las otras respuestas proporcionadas no funcionarán cuando se trata de convertir un objeto, simplemente se convierta los campos de ese objeto en una matriz asociativa (a menos que eso sea lo que está intentando hacer).

$var = (array)$arr;