【问题标题】:How to cast variable to array如何将变量转换为数组
【发布时间】:2011-08-23 15:19:45
【问题描述】:

我有一个变量 $v,它可以是单个字符串或字符串数​​组
我有一个代码:

$a = array();
if (is_array($v)) {
    $a = $v;
} else {
    $a[] = $v;
}

如何以更优雅的方式完成? (换句话说,如何将变量转换为数组)

【问题讨论】:

    标签: php arrays variables casting


    【解决方案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()(空数组)
              猜你喜欢
              • 2011-08-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-08-29
              • 2018-06-27
              • 2013-05-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多