如何将变量转换为数组

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:我认为类型转换很重要如果你有一个变量,它会受到突变,然后是一个接受数组的函数,例如foreachimplode 否则你会遇到不需要的错误和警告。 选角是这个问题的正确答案,但我投了反对票,因为“没有必要这样做”是不好的信息。 我同意@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:

对于integerfloatstringbooleanresource 中的任何类型, 将值转换为数组会生成一个包含单个 索引为零的元素和标量的值 转换。换句话说,(array)$scalarValuearray($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()(空数组)

以上是关于如何将变量转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将数组值转换为变量?

如何将 Array<AnyObject> 转换为空数组变量?

将 PHP 数组转换为类变量

javascript中如何将获得的整型数值转换为字节数组

将张量变量(非常数)转换为 numpy 数组? [复制]

自动将字符串转换为数组中的变量