增加多维数组上的键

时间:2014-07-11 04:36:59

标签: php arrays

我有以下php数组:

$month = array (
    'weeks'=> array(
        'w1'=> array(
          'd1'=> 'day one',
          'd2'=> 'day two',
          'd3'=> array(
             'H1' => 'hour one',
             'H2' => 'hour two' 
           )
        ),
        'w2'=> array(
          'd1'=> 'day one',
          'd2'=> 'day two'
        )
    )
);

我想递归迭代数组并更改键以反映从月初开始的递增时间。像这样(简化):

$month = array (
    'weeks'=> array(
        '1'=> array(
          '1'=> 'day one',
          '2'=> 'day two',
          '3'=> array(
             '3' => 'hour one',
             '4' => 'hour two' 
           )
        ),
        '5'=> array(
          '5'=> 'day one',
          '6'=> 'day two'
        )
    )
);

注意:计数器在逐步降低到孩子时不会递增。这反映了一周的开始时间和第一天的开始时间都具有相同的时间戳。计数器为下一个兄弟计数器递增,计数器在一个'键/值'之后递增。一对没有孩子。

1 个答案:

答案 0 :(得分:3)

这是'嵌套数组'的示例,输出数组与输入结构完全匹配。唯一的区别是数组键变成了“几乎”递增的整数下标。

'几乎'部分来自这样一个事实:当'嵌套'一个级别时,第一个条目与前一个级别具有相同的下标。

我接近这个的方法是使用递归函数,它将处理'嵌套',以及每个'级别内的'foreach'循环,因为数组中的每个条目在输出中保持相同的'级别'

输出:这需要包含许多级别,而不是将下标路径存储到当前输出级别,我只是通过引用传递一个数组,可以通过适当的代码进行简单设置。

代码: running with the given input using PHP 5.3.19 at 'viper-7'

首先执行工作的功能:

注意:$ destWeeks和$ idxNew变量作为'references'传递,这允许代码直接修改它们。

function reindexWeeks($sourceWeeks, &$destWeeks, &$idxNew)
{
    foreach($sourceWeeks as $sourceKey => $sourceValue) {
        if (is_array($sourceValue)) {
            $destWeeks[$idxNew] = array();
            reindexWeeks($sourceValue, $destWeeks[$idxNew], $idxNew);
        }
        else {
            $destWeeks[$idxNew] = $sourceValue;
            $idxNew++;
        }
    }
}

致电代码:

$idxNew = 1;  // starting index.
$newWeeks = array(); // output array at the 'week' level

reindexWeeks($month['weeks'], $newWeeks, $idxNew); // re-index the array 

// output array..
$newMonth = array('weeks' => $newWeeks);

使用问题中提供的示例输出:

Array
(
    [weeks] => Array
        (
            [1] => Array
                (
                    [1] => day one
                    [2] => day two
                    [3] => Array
                        (
                            [3] => hour one
                            [4] => hour two
                        )

                )

            [5] => Array
                (
                    [5] => day one
                    [6] => day two
                )

        )

)