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