如何迭代这个多维数组并返回正数的数量和负数的计数。答案应该是1正面和5负面。感谢。
Array
(
[Nov 18, 2011] => Array
(
[C] => Array
(
[C] => Array
(
[T] => -1324.388328
)
[S] => Array
(
[T] => -249.976472
)
)
)
[Dec 24, 2011] => Array
(
[C] => Array
(
[C] => Array
(
[T] => -2523.107928
)
[S] => Array
(
[T] => 103.533528
)
)
)
[Dec 27, 2011] => Array
(
[C] => Array
(
[C] => Array
(
[T] => -4558.837928
)
[S] => Array
(
[T] => -1639.376472
)
)
)
)
答案 0 :(得分:2)
你也可以将SPL的RecursiveIteratorIterator
与RecursiveArrayIterator
结合使用,如下所示:
$pos = $neg = 0;
foreach( new RecursiveIteratorIterator( new RecursiveArrayIterator( $data ) ) as $item )
{
if( !is_numeric( $item ) ) continue;
$item < 0 ? $neg++ : $pos++;
}
var_dump( $pos, $neg );
$data
表示多维数组。 RecursiveIteratorIterator
默认只迭代所谓的叶子(没有任何子代的项目)。作为一种安全措施,我仍然加入了一项测试,以检查该项目是否确实是一个数值。
答案 1 :(得分:1)
如果目标是计算未知深度的多维数组的正数和负数,则构建递归函数。如果不是这样,递归函数也可以完成工作。
function countFromMultidimentionalArray($array)
{
$positiveCount = 0;
foreach($array as $value)
{
if(is_array($value))
{
$positiveCount += countFromMultidimentionalArray($value);
}
else
{
if($value >= 0)
{
$positiveCount++;
}
}
}
return $positiveCount;
}
我没有对此进行测试,只计算正数。你可以创建一个类似于只计算负数或的函数,更有趣的是,找到一种在同一函数中执行这两种操作的方法(可能使用对象?)。它只是给你一个ideia,因为这看起来像家庭作业,我不想破坏所有的乐趣:)
编辑:鉴于这不是家庭作业,这里有一个更精细的解决方案,使用数组来保存这两个值。
function countFromMultidimentionalArray($array)
{
$values = array();
$values["positive"] = 0;
$values["negative"] = 0;
foreach($array as $value)
{
if(is_array($value))
{
$result += countFromMultidimentionalArray($value);
$values["positive"] += $result["positive"];
$values["negative"] += $result["negative"];
}
else
{
if($value >= 0)
{
$values["positive"]++;
}
else
{
$values["negative"]++;
}
}
}
return $values;
}
也没有测试过这个。希望它有所帮助!
答案 2 :(得分:0)
我遇到了一些递归解决方案的问题,因为我也在学习[如上所示将计数设置为零将清除每次递归调用的当前计数,并且在传递计数时我没有解决参考/范围错误作为函数参数]。
另外,我必须修改原始数组定义的符号以使我的测试工作
A)我假设你的密钥是字符串文字,而不是变量或常量。所以我添加了''包装器。如果它们是在其他地方定义的变量,请添加'$'..
B)你需要用逗号分隔单个数组中的元素列表,我添加了
C)技术上没有必要,但我在定义时不使用括号表示法,只有在创建后通过键访问时才使用。开发人员的选择,但它有助于我在以后回到代码时确定我是(创建或使用现有的)数组元素。
D)不要忘记包括你的';'在定义数据数组之后,数组defs不像函数或条件代码{}结构
不可否认,这是一个比递归稍微不那么强大的解决方案,但它允许您按键和值完全访问每个元素,此时您可以根据需要报告或操作值。这种方法的限制是你需要知道有多少级别的嵌套(以及多少个foreach循环)。结果是向现有阵列级别添加元素不会影响循环逻辑。
<?php
function html_pp ( $text ) // no return
{
// echo paragraph to browser
echo PHP_EOL . '<p>' . Sprintf ( $text ) . '</p>' . PHP_EOL;
}
// Data array
$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 )
)
)
); // end array def
// Count variables
$positive = 0;
$negative = 0;
html_pp ( 'Data Array :' );
// Loop using key => value pairs
foreach ( $data as $i => $date ) // Iterate through date elements
{
foreach ( $date as $j => $c ) // Iterate through C elements
{
foreach ( $c as $k => $cs ) // Iterate through C/S elements
{
foreach ( $cs as $n => $t ) // Iterate though T elements
{
// echo current element nesting path and value
html_pp ( $i . '>' . $j . '>' . $k . '>' . $n . ' = ' . $t );
// update +- counts
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日&gt; C&gt; S&gt; T = -249.976472
2011年12月24日&gt; C&gt; C&gt; T = -2523.107928
2011年12月24日&gt; C&gt; S&gt; T = 103.533528
2011年12月27日&gt; C&gt; C&gt; T = -4558.837928
2011年12月27日&gt; C&gt; S&gt; T = -1639.376472
正面:1
否定:5