我有一个变量$v$,它可以是单个字符串或者字符串数组
现在我有如下代码:
$a = array();
if (is_array($v)) {
$a = $v;
} else {
$a[] = $v;
}
有没有更加优雅的方法实现这个功能?(换句话说,如何将一个变量强制转换为数组)
您可以通过以下方式将变量转换为数组:
$var = (array)$arr;
$a = (array) $v;
答案就是它。
我会像这样编写您的代码片段(简短且易于阅读,您可以立即知道正在发生什么):
$a = is_array($v) ? $v : array($v);
如果$v
是一个标量(布尔值、字符串、数字),你可以使用:
a) $v = (array)$v;
如果$v
是一个对象,你需要使用:
b) $v = is_array($v) ? $v : array($v);
方法(b)在所有情况下都适用(包括标量的情况)。
$list = array([0] => $obj);
当尝试转换一个对象时,其他提供的答案不起作用,它只会将该对象的字段转换为关联数组(除非这正是您想要做的)。
$var = (array)$arr;
实际上,如果你想将其转换为数组并且不必担心放入其中的内容,答案就是
$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");
}
$var = (array) $obj;
这样将对象强制转换为数组 -> $object = new stdClass;
应该被强制转换为空数组 array()
。 - Philipp
$arr = null; var_dump((array) $arr, array($arr));
返回:array(0) {}(正确),然后array(1) { [0] => NULL }(不正确)此外,关于cbroughton的正确答案,当变量必须在foreach()中使用时,需要进行这样的转换:如果变量不是数组(或可迭代的),将会出现PHP警告。 - FGMforeach
或implode
,否则你将遇到不必要的错误和警告。 - GFargo$z=[1,2]
,请注意(array)$z
和[$z]
之间的区别,因为它们的 类型 已经是 _array_,所以不会影响 $z,而[$z]
则会在 $z 周围显式添加一个数组包装层。 - St3an