在多维PHP数组中添加默认值

时间:2013-11-18 10:26:07

标签: php arrays

我有一个数组数组,其中第一个项是一个简单的标签数组,然后其余的值是第一个元素是日期编号的数组,第二个元素是那天的视图元素数。所以在我的吼叫示例中,第2天有163个视图,第5天有9个视图。

array (size=3)
  0 => 
    array (size=2)
      0 => string 'Day' (length=3)
      1 => string 'Pageviews' (length=9)
  1 => 
    array (size=2)
      0 => string '2' (length=1)
      1 => int 163
  2 => 
    array (size=2)
      0 => string '5' (length=1)
      1 => int 9

我想要的是为这个数组中没有出现的日子添加0个视图。因此,如果我想从1到18天的间隔开始,我怎么能创建一个每天都有我的观点的数组,以及那些不在我的第一个数组中的0个视图?

3 个答案:

答案 0 :(得分:0)

单循环解决方案:

我假设每个(数组键+ 1)是日期编号。如果是这样,你可以尝试这种方法:

$array = ... //your filled array
$existingDays = array();
$totalDays = 18;

for ($i = 1; $i <= $totalDays; $i++) {
    $existingDays[$array[$i][0]] = true;

    if (!array_key_exists($i, $existingDays)) {
        $array[$i] = array( (string)($i+1), 0);
    }
}

修改
由于您不知道现有日期的列表,因此可以创建另一个数组$existingDays并在每个循环步骤中使用正确的日期填充它。注意:

  • 我用填充数组,而不是。原因是检查数组中是否存在键比检查值是否存在更快(in_array()函数遍历整个数组)
  • 如你所说,天数按升序排序,因此我们可以在执行$existingDays之前将日期添加到同一循环中的if数组中。单个天数至少与当前数组键相同(但通常更大),因此无法在意外检查$existingDays 即可。

答案 1 :(得分:0)

这段代码应该是你想要实现的技巧:

//storing the days present in the array
$days_present = array_column($input_array,0,0);

for($i=1; $i<32; $i++){
    //push if days are not present in the input array
    if(!array_key_exists($i, $day_present) )
        array_push($input_array,array($i,0) );
}

答案 2 :(得分:0)

我已经想通了。下面的代码将按升序获得所有关联,默认值为0:

    $existingArray = 'my existing array';

    $existingDays = array_column($existingArray, 0);
    $existingViews = array_column($existingArray, 1);

    //I use this array to track relationships between days and views
    $bindings = array_combine($existingDays, $existingViews);

    $viewsData = array();
    $viewsData[0] = array('Day', 'Pageviews');

    for ($day = 1; $day <= 8; $day++) {
        $viewsNumber = (isset($bindings[$day])) ? $bindings[$day] : 0;
        $viewsData[] = array($day, $viewsNumber);
    }
    return $viewsData;