Php 如何将变量强制转换为数组

Php 如何将变量强制转换为数组,php,arrays,variables,casting,Php,Arrays,Variables,Casting,我有一个变量$v,可以是单个字符串,也可以是字符串数组,我有一个代码: $a = array(); if (is_array($v)) { $a = $v; } else { $a[] = $v; } 如何以更优雅的方式完成?(换句话说,如何将变量强制转换为数组)您可以使用以下命令将变量强制转换为数组: $var = (array)$arr; 是答案。或者您可以使用: 用于明确变量类型。这和幕后的打字完全一样。(对于分组式打字更有用,例如在循环中。)我会这样写您的代码

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

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

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

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

    $var = (array)$arr;

是答案。

或者您可以使用:


用于明确变量类型。这和幕后的打字完全一样。(对于分组式打字更有用,例如在循环中。)

我会这样写您的代码片段(简短,您阅读它,并确切知道发生了什么):


事实上,如果你想对一个数组进行强制转换,而不必担心你在其中放入了什么,答案是

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


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

$list = array([0] => $obj);
其他提供的答案在尝试转换对象时不起作用,它只会将该对象的字段转换为关联数组(除非您正试图这样做)


正如其他人所说,将标量值转换为数组将生成一个单例数组(即标量作为其唯一元素的数组)。然而,正如其他人所指出的,只有当您知道值将是标量而不是类实例时,才需要注意这样做

发件人:

对于任何类型的
整数
浮点
字符串
布尔
资源
, 将值转换为数组将生成具有单个 元素,该元素的索引为零,标量的值为 转换。换句话说,
(数组)$scalarValue
数组($scalarValue)

如果将对象转换为数组,则结果是 元素是对象的属性。键是成员变量 名称,但有几个显著的例外:整数属性是 不可接近;私有变量的类名在 变量名;受保护的变量在 变量名。这些带前缀的值两边都有空字节

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

a)
$v=(数组)$v

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

b)
$v=is\u数组($v)$五:阵列(五美元)


方法(b)适用于所有情况(也适用于标量)。

太短了,我不得不添加填充字符:-PI知道这个答案很老了,但这不应该是
$a=(数组)$v?至少对于OP来说是这样。这会导致php出现意外行为。正确的方法是数组($arr)。答案是正确的。@Ulterior的评论并非如此。示例:$arr=null;变量转储((数组)$arr,数组($arr));返回:array(0){}(correct),然后array(1){[0]=>NULL}(correct)。另外,关于cbroughton的正确答案,当变量必须在foreach()中使用时,需要此类强制转换:如果变量不是数组(或iterable),会有一个PHP警告。FWIW:我认为,如果你有一个变量,它会发生变异,然后是一个接受数组的函数,例如,
foreach
内爆
,那么类型转换是很重要的,否则你会遇到不必要的错误和警告。类型转换是这个问题的正确答案,但是我投了反对票,因为“没有必要这么做”是不好的信息。我同意@Stephern,我已经编辑了这个信息,不可能了。事实上。。。事实并非如此。您可以将对象强制转换为数组,如
$var=(数组)$obj
->
$object=新的stdClass应强制转换为
数组()
(空数组)
settype($a, "array");
$a = is_array($v) ? $v : array($v);
$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");
}
$list = array([0] => $obj);
$var = (array)$arr;