我有以下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'
)
)
);
注意:计数器在逐步降低到孩子时不会递增。这反映了一周的开始时间和第一天的开始时间都具有相同的时间戳。计数器为下一个兄弟计数器递增,计数器在一个'键/值'之后递增。一对没有孩子。
答案 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
)
)
)