我有以下代码,我想摆脱调用时间传递引用,(从5.2转换为5.3)但我不确定究竟是什么方法正确这将是(类,全局变量,?)
这是一个应该包含所有内容的键盘 http://codepad.org/ombgFPMR
<?php
function count_things($item, $key, $total) {
$total++;
}
$counts = array(100 => 1,
101 => 1,
102 => array(
106 => 1,
107 => 1
),
103 => 1,
104 => 1,
105 => array(
108 => 1,
109 => array(
110 => 1,
111 => 1,
112 => 1
)
)
);
foreach($counts as $key => $count) {
$total = 0;
if(is_array($count)) {
$total++;
/* The below is a logic error. Array elements that contain arrays do not get
the callback function called on them. Therefore, any children with children
of their own will not be counted. In the output of this paste,
the final key, $final_counts[105]['total'], should have a value of 6, but it
actually has a value of 5. */
array_walk_recursive($count, 'count_things', &$total);
} else {
$total = $count;
}
$final_counts[$key]['total'] = $total;
}
print_r($final_counts);
?>
输出如下:
Array
(
[100] => Array
(
[total] => 1
)
[101] => Array
(
[total] => 1
)
[102] => Array
(
[total] => 3
)
[103] => Array
(
[total] => 1
)
[104] => Array
(
[total] => 1
)
[105] => Array
(
[total] => 5
)
)
答案 0 :(得分:3)
您可以将 count
与COUNT_RECURSIVE
标志一起使用。
你应该使用闭包,这些是在5.3.0中引入的,所以它们应该可以工作。
<?php
$counts = array(
100 => 1,
101 => 1,
102 => array(
106 => 1,
107 => 1
),
103 => 1,
104 => 1,
105 => array(
108 => 1,
109 => array(
110 => 1,
111 => 1,
112 => 1
)
)
);
$final_counts = array();
foreach($counts as $key => $count) {
if(is_array($count)) {
$total = 1;
array_walk_recursive($count, function() use (&$total) {
$total++;
});
} else {
$total = $count;
}
$final_counts[$key]['total'] = $total;
}
print_r($final_counts);
如果您将问题置于上下文中,我或许可以提供更好的解决方案。
答案 1 :(得分:-1)
如果你真的想使用array_walk_rec。
更改:
function count_things($item, $key, $total) {
$total++;
}
通过
function count_things($item, $key, &$total) {
global $total; // I dislike it, but it'S the only way I know for continue use array_walk_recurive in your case
$total++;
}
并且
array_walk_recursive($count, 'count_things', &$total);
通过
array_walk_recursive($count, 'count_things', $total);