4

我有以下代码,我想摆脱调用时传递引用,(从 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
    )

)
4

1 回答 1

3

您可以countCOUNT_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);

如果您将问题放在上下文中,我可能会提供更好的解决方案。

于 2012-06-06T21:46:09.800 回答