【发布时间】:2011-08-23 15:19:45
【问题描述】:
我有一个变量 $v,它可以是单个字符串或字符串数组
我有一个代码:
$a = array();
if (is_array($v)) {
$a = $v;
} else {
$a[] = $v;
}
如何以更优雅的方式完成? (换句话说,如何将变量转换为数组)
【问题讨论】:
标签: php arrays variables casting
我有一个变量 $v,它可以是单个字符串或字符串数组
我有一个代码:
$a = array();
if (is_array($v)) {
$a = $v;
} else {
$a[] = $v;
}
如何以更优雅的方式完成? (换句话说,如何将变量转换为数组)
【问题讨论】:
标签: php arrays variables casting
您可以使用以下方法将变量转换为数组:
$var = (array)$arr;
【讨论】:
foreach 或 implode 否则你会遇到不需要的错误和警告。
$a = (array) $v;
就是答案。
【讨论】:
$a = (array) $v; 吗?至少对于 OP 而言。
我会像这样写你的可能 sn-p(简短,你阅读它并确切地知道发生了什么):
$a = is_array($v) ? $v : array($v);
【讨论】:
【讨论】:
如果您希望将一个对象转换为单个计数数组,您可以使用以下代码:
$list = array([0] => $obj);
其他提供的答案在尝试转换对象时不起作用,它只会将该对象的字段转换为关联数组(除非您正在尝试这样做)。
$var = (array)$arr;
【讨论】:
正如其他人所说,将 标量 值转换为数组将产生一个单例数组(即,标量作为其唯一元素的数组)。但是,正如其他人指出的那样,只有在您知道该值将是一个标量而不是 类实例 时才注意这样做。
来自the PHP docs:
对于
integer、float、string、boolean和resource中的任何类型, 将值转换为数组会生成一个包含单个 索引为零的元素和标量的值 转换。换句话说,(array)$scalarValue与array($scalarValue).如果将对象转换为数组,则结果是一个数组,其 元素是对象的属性。键是成员变量 名称,除了一些值得注意的例外:整数属性是 无法访问;私有变量的类名附加到 变量名;受保护的变量前面有一个“*” 变量名。这些前置值在两边都有空字节。
【讨论】:
如果$v 是标量(布尔值、字符串、数字),您可以使用:
a) $v = (array)$v;
如果$v 是一个对象,你必须使用:
b) $v = is_array($v) ? $v : array($v);
方法 (b) 适用于所有情况(也适用于标量)。
【讨论】:
实际上,如果您想转换为数组而不必担心放入其中的内容,答案是
$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()(空数组)