有没有更好的方法来创建数组键以避免丢失索引通知?

时间:2013-11-25 15:20:30

标签: php arrays multidimensional-array isset

我正在遍历一堆数据,而我似乎正在做一些感觉有点重复的事情。

if(!isset($productitems[$stop->route_id])){
    $productitems[$stop->route_id] = [];
}
if(!isset($productitems[$stop->route_id][$location_id])){
    $productitems[$stop->route_id][$location_id] = [];
}
if(!isset($productitems[$stop->route_id][$location_id][$week])){
    $productitems[$stop->route_id][$location_id][$week] = [];
}
if(!isset($productitems[$stop->route_id][$location_id][$week][$day])){
    $productitems[$stop->route_id][$location_id][$week][$day] = [];
}
if(!isset($productitems[$stop->route_id][$location_id][$week][$day][$task->product_id])){
    $productitems[$stop->route_id][$location_id][$week][$day][$task->product_id] = [];
}
if(!isset($productitems[$stop->route_id][$location_id][$week][$day][$task->product_id][(int)$task->refill_id])){
    $productitems[$stop->route_id][$location_id][$week][$day][$task->product_id][(int)$task->refill_id] = 0;
}

在没有所有isset检查的情况下,是否有不同的方法来填充这些多维数组?

编辑我知道只是在php中设置$productitems[$stop->route_id][$location_id][$week][$day][$task->product_id][(int)$task->refill_id]是可能的,但是php会记录一个警告,我正在处理的项目使用Laravel会抛出异常。

2 个答案:

答案 0 :(得分:2)

如果子密钥不存在,PHP会自动创建子密钥(您可以通过选中isset来避免通知)。如果您愿意,可以随意创建一个为您完成的功能(最小化变量的双重粘贴。

<强>代码

<?php
    error_reporting(E_ALL);

    function setDefault(&$variable, $default) {
        if (!isset($variable)) {
            $variable = $default;
        }
    }

    $foo = array(
        'foo' => 'oof'
    );

    setDefault($foo['sub']['arrays']['are']['pretty']['cool'], 0);

    print_r($foo);
?>

<强>输出

Array
(
    [foo] => oof
    [sub] => Array
        (
            [arrays] => Array
                (
                    [are] => Array
                        (
                            [pretty] => Array
                                (
                                    [cool] => 0
                                )

                        )

                )

        )

)

DEMO

3v4l表示4.3.0到5.5.6的任何PHP版本都没有通知,而this明显吐出通知。

如果您不想使用某个功能,请随意使用代码中的最后if条件:

<?php
    error_reporting(E_ALL);

    $foo = array(
        'foo' => 'oof'
    );

    if (!isset($foo['sub']['arrays']['are']['pretty']['cool'])) {
        $foo['sub']['arrays']['are']['pretty']['cool'] = 0;
    }

    print_r($foo);
?>

3v4l demo

答案 1 :(得分:0)

好的php不需要声明所有内容,所以我会说你不需要任何这些。我只是在命令提示符下在我的本地机器上尝试了它,这是输出...

CODE:

<?php

    $productitems['a']['b']['c']['d']['e']['f'] = 65;
    var_dump($productitems);
?>

输出:

array(1) {
  ["a"]=>
  array(1) {
    ["b"]=>
    array(1) {
      ["c"]=>
      array(1) {
        ["d"]=>
        array(1) {
          ["e"]=>
          array(1) {
            ["f"]=>
            int(65)
          }
        }
      }
    }
  }
}