【问题标题】:How to generate an array using a default values array and a new values array?如何使用默认值数组和新值数组生成数组?
【发布时间】:2016-07-24 03:15:58
【问题描述】:

我有一个数组$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
]

【问题讨论】:

  • 不需要放置else部分。
  • @Yash :通过删除它,我得到了这个array:7 [▼ 0 =&gt; 2 1 =&gt; 2 2 =&gt; 4 3 =&gt; 1 5 =&gt; 1 8 =&gt; 2 9 =&gt; 3 ] 我的目标是得到其中的 24 个。 :)
  • 看起来 @u_mulder 明白了我的意思。
  • 在 else 部分,您仍然会遍历 $d_visitors 中与您的条件不匹配的值

标签: php arrays sorting merge default-value


【解决方案1】:

试试这个方法:

$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],之前已设置。

【讨论】:

    【解决方案2】:

    您需要使用一个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;
                }
            }
    

    【讨论】:

      【解决方案3】:

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

      我该怎么做:

      1. 根据键将默认数组与另一个数组合并
      2. ksort()结果数组?

      虽然您可以在每次迭代中使用foreach() 循环和条件语句来实现您想要的结果,但我可以向您展示一种更简洁、更简单的方法:

      这是您的新数据数组:$array=[2=&gt;4,5=&gt;1,8=&gt;2,3=&gt;1,1=&gt;2,9=&gt;3,0=&gt;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)));
      

      完成——合并和排序。


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

      【讨论】:

        猜你喜欢
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 2015-01-31
        • 2018-07-12
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多