如何将变量转换为数组
Posted
技术标签:
【中文标题】如何将变量转换为数组【英文标题】:How to cast variable to array 【发布时间】:2011-08-23 15:19:45 【问题描述】:我有一个变量 $v,它可以是单个字符串或字符串数组我有一个代码:
$a = array();
if (is_array($v))
$a = $v;
else
$a[] = $v;
如何以更优雅的方式完成? (换句话说,)
【问题讨论】:
【参考方案1】:您可以使用以下方法将变量转换为数组:
$var = (array)$arr;
【讨论】:
这会导致 php 出现意外行为。正确的方法是 array($arr) 答案是正确的。 @Ulterior 的评论不是。示例:$arr = null; var_dump((array) $arr, array($arr));返回:array(0) (正确),然后是 array(1) [0] => NULL (不正确)另外,关于 cbroughton 的正确答案,当变量必须用于foreach():如果变量不是数组(或可迭代),则会出现 PHP 警告。 FWIW:我认为类型转换很重要如果你有一个变量,它会受到突变,然后是一个接受数组的函数,例如foreach
或 implode
否则你会遇到不需要的错误和警告。
选角是这个问题的正确答案,但我投了反对票,因为“没有必要这样做”是不好的信息。
我同意@StephenR,我已经编辑了该信息,这是不可能的。【参考方案2】:
$a = (array) $v;
就是答案。
【讨论】:
它太短了,我不得不添加填充字符:-P 我知道这个答案已经很老了,但这不应该是$a = (array) $v;
吗?至少对于 OP 而言。【参考方案3】:
我会像这样写你的可能 sn-p(简短,你阅读它并确切地知道发生了什么):
$a = is_array($v) ? $v : array($v);
【讨论】:
【参考方案4】:您也可以使用settype
:
settype($a, "array");
用于显式变量类型。这与幕后类型转换所发生的情况完全相同。 (对于分组类型转换更有用,例如在循环中。)
【讨论】:
【参考方案5】:如果您希望将一个对象转换为单个计数数组,您可以使用以下代码:
$list = array([0] => $obj);
其他提供的答案在尝试转换对象时不起作用,它只会将该对象的字段转换为关联数组(除非您正在尝试这样做)。
$var = (array)$arr;
【讨论】:
【参考方案6】:正如其他人所说,将 标量 值转换为数组将产生一个单例数组(即,标量作为其唯一元素的数组)。但是,正如其他人指出的那样,只有在您知道该值将是一个标量而不是 类实例 时才注意这样做。
来自the PHP docs:
对于
integer
、float
、string
、boolean
和resource
中的任何类型, 将值转换为数组会生成一个包含单个 索引为零的元素和标量的值 转换。换句话说,(array)$scalarValue
与array($scalarValue)
.如果将对象转换为数组,则结果是一个数组,其 元素是对象的属性。键是成员变量 名称,除了一些值得注意的例外:整数属性是 无法访问;私有变量的类名附加到 变量名;受保护的变量前面有一个“*” 变量名。这些前置值在两边都有空字节。
【讨论】:
【参考方案7】:如果$v
是标量(布尔值、字符串、数字),您可以使用:
a) $v = (array)$v;
如果$v
是一个对象,你必须使用:
b) $v = is_array($v) ? $v : array($v);
方法 (b) 适用于所有情况(也适用于标量)。
【讨论】:
【参考方案8】:实际上,如果您想转换为数组而不必担心放入其中的内容,答案是
$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()
(空数组)以上是关于如何将变量转换为数组的主要内容,如果未能解决你的问题,请参考以下文章