如何将变量转换为数组

时间:2011-05-11 20:32:47

标签: php arrays variables casting

我有一个变量$ v,可以是单个字符串或字符串数​​组,我有一个代码:

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

如何以更优雅的方式完成? (换句话说,如何将变量转换为数组)

8 个答案:

答案 0 :(得分:56)

您可以使用以下命令将变量强制转换为数组:

    $var = (array)$arr;

答案 1 :(得分:17)

$a = (array) $v;

就是答案。

答案 2 :(得分:7)

我会像这样写你的片段(简短,你读它并确切地知道发生了什么):

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

答案 3 :(得分:3)

或者您可以使用settype

settype($a, "array");

用于表示变量类型。这与幕后的类型转换完全相同。 (对于分组类型转换更有用,例如在循环中。)

答案 4 :(得分:1)

如果您要将对象转换为单个计数数组,可以使用以下代码:

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

另一个提供的答案在尝试转换对象时不会起作用,它只会将该对象的字段转换为关联数组(除非您正在尝试这样做)。

$var = (array)$arr;

答案 5 :(得分:0)

正如其他人所说,将 scalar 值强制转换为数组将产生单例数组(即,以标量为唯一元素的数组)。但是,正如其他人指出的那样,请仅在知道值将是标量而不是 class实例 的情况下,才执行此操作。

来自the PHP docs

  

对于integerfloatstringbooleanresource中的任何类型,   将值转换为数组会导致单个数组   元素的索引为零,标量值为   转换。换句话说,(array)$scalarValue与   array($scalarValue)

     

如果将对象转换为数组,则结果为数组,其   元素是对象的属性。键是成员变量   名称,但有一些值得注意的例外:整数属性是   无法访问;私有变量的类名前面带有   变量名;受保护的变量前面带有“ *”   变量名。这些前置值的两边都为空字节。

答案 6 :(得分:0)

如果$v标量(布尔,字符串,数字),则可以使用:

a) $v = (array)$v;

如果$v对象,则必须使用:

b) $v = is_array($v) ? $v : array($v);

方法(b)在每种情况下都适用(也有标量)。

答案 7 :(得分:-3)

实际上,如果您想要转换为数组而不必担心放入数组,答案是

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

您可以使用以下代码对此进行测试

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");
}