我在递归解决方案中遇到了一些问题,因为我也在学习[如上所示将计数器设置为零会在每次递归调用时清除您当前的计数,并且当将计数作为函数参数传递时,我还没有解决引用/作用域错误]。
此外,我不得不修改您原始数组定义的符号以使我的测试工作。
A)我假设您的键是字符串文字,而不是变量或常量。因此,我添加了''包装器。如果它们是指在其他地方定义的变量,则添加'$'..
B)您需要在单个数组中用逗号分隔元素列表,我已经添加了
C)从技术上讲并不必要,但我在定义时不使用括号表示法,只有在创建后按键访问时才使用。开发人员可以自行选择,但这有助于我确定我是否(创建或使用现有的)数组元素,当我以后回到代码时。
D)不要忘记在定义数据数组后包含';',数组定义不像函数或条件代码{}结构那样自我关闭
诚然,这种方法比递归解决方案略逊一筹,但它可以通过键和值完全访问每个元素,此时您可以根据需要报告或操作值。该方法的限制是您需要知道多少级别的嵌套(因此需要多少foreach循环)。好处是将元素添加到现有数组级别不会影响循环逻辑。
<?php
function html_pp ( $text ) // no return
{
echo PHP_EOL . '<p>' . Sprintf ( $text ) . '</p>' . PHP_EOL;
}
$data = Array
(
'Nov 18, 2011' => Array
(
'C' => Array
(
'C' => Array ( 'T' => -1324.388328 ), // comma
'S' => Array ( 'T' => -249.976472 )
)
), // comma
'Dec 24, 2011' => Array
(
'C' => Array
(
'C' => Array ( 'T' => -2523.107928 ), // comma
'S' => Array ( 'T' => 103.533528 )
)
), // comma
'Dec 27, 2011' => Array
(
'C' => Array
(
'C' => Array ( 'T' => -4558.837928 ), // comma
'S' => Array ( 'T' => -1639.376472 )
)
)
);
$positive = 0;
$negative = 0;
html_pp ( 'Data Array :' );
foreach ( $data as $i => $date )
{
foreach ( $date as $j => $c )
{
foreach ( $c as $k => $cs )
{
foreach ( $cs as $n => $t )
{
html_pp ( $i . '>' . $j . '>' . $k . '>' . $n . ' = ' . $t );
if ( $t < 0 ) { $negative += 1; }
else { $positive += 1; }
}
}
}
}
html_pp ( 'Positive : ' . $positive );
html_pp ( 'Negative : ' . $negative );
?>
浏览器输出:
数据数组:
2011年11月18日>C>C>T = -1324.388328
2011年11月18日>C>S>T = -249.976472
2011年12月24日>C>C>T = -2523.107928
2011年12月24日>C>S>T = 103.533528
2011年12月27日>C>C>T = -4558.837928
2011年12月27日>C>S>T = -1639.376472
正数:1
负数:5