如何使用默认值数组和新值数组生成数组?

时间:2016-04-04 14:11:32

标签: php arrays sorting merge default-value

我有一个数组$d_visitors = array_count_values($d_visitors);

array:7 [▼
  2 => 4
  5 => 1
  8 => 2
  3 => 1
  1 => 2
  9 => 3
  0 => 2
]

我尝试循环播放该数组24次,并检查密钥是否匹配,并存储其值。

$dv = [];
for ($i = 0; $i < 24; $i++){
    foreach ($d_visitors as $k =>$v) {
        if($i == $k ){
            $dv[$i] = $v;
        }else{
            $dv[$i] = 0;
        }
    }
}

我试图打印出类似这样的内容:

array:24 [▼
  0 => 2
  1 => 2
  2 => 4
  3 => 1
  4 => 0
  5 => 1
  6 => 0
  7 => 0
  8 => 2
  9 => 3
  10 => 0
  11 => 0
  12 => 0
  13 => 0
  14 => 0
  15 => 0
  16 => 0
  17 => 0
  18 => 0
  19 => 0
  20 => 0
  21 => 0
  22 => 0
  23 => 0
]

但我一直得到这个:

array:24 [▼
  0 => 2
  1 => 0
  2 => 0
  3 => 0
  4 => 0
  5 => 0
  6 => 0
  7 => 0
  8 => 0
  9 => 0
  10 => 0
  11 => 0
  12 => 0
  13 => 0
  14 => 0
  15 => 0
  16 => 0
  17 => 0
  18 => 0
  19 => 0
  20 => 0
  21 => 0
  22 => 0
  23 => 0
]

3 个答案:

答案 0 :(得分:2)

尝试这种方式:

$dv = [];
for ($i = 0; $i < 24; $i++){
    $dv[$i] = 0;
    if (isset($d_visitors[$i])) {
        $dv[$i] = $d_visitors[$i];
    }
}

更简化的是:

$dv = [];
for ($i = 0; $i < 24; $i++){
    $dv[$i] = isset($d_visitors[$i])? $d_visitors[$i] : 0;
}

您的代码中的问题在行$dv[$i] = 0;中,因为它设置为先前已设置的$dv[$i]

答案 1 :(得分:1)

您需要使用一个flag变量。你的代码也是正确的。

试试这样:

$dv = [];
        $flag = 0;
        for ($i = 0; $i < 24; $i++){
            $flag = 0;
            foreach ($d_visitors as $k =>$v) {
                if($i == $k ){
                    $dv[$i] = $v;
                    $flag = 1;
                }
            }
            if($flag == 0){
                $dv[$i] = 0;
            }
        }

答案 2 :(得分:1)

询问您的流程的另一种方式是:

我怎么能:

  1. 将默认数组与基于键的另一个数组合并
  2. ksort()结果数组?
  3. 虽然您可以在每次迭代时使用foreach()循环和条件语句来实现所需的结果,但我可以向您展示更简洁,更简单的方法:

    这是您的新数据阵列:$array=[2=>4,5=>1,8=>2,3=>1,1=>2,9=>3,0=>2];

    设置默认数据阵列有两种方法:

    $defaults=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; // 24 elements with 0 value
    

    或更优雅:

    $defaults=array_fill(0,24,0);
    

    然后,您只需要调用array_replace()以使用新值覆盖默认值。这将使密钥保持ASC顺序。

    var_export(array_replace($defaults,$array));
    

    您甚至可以嵌套函数调用,并避免将变量名称添加到全局范围,如下所示:

    $d_visitors=array_replace(array_fill(0,24,0),array_count_values($d_visitors)));
    

    完成 - 合并和ksorted。

    为了展示程序员可能尝试组合两个数组的其他方式(无结果或不合逻辑),这里是demonstration