使用回调筛选数组-适用于一维和多维数组

时间:2012-08-31 作者:kaiser

我附加了一个过滤器,可以修改阵列:

$data = apply_filters( \'wpse_example_filter\', $data );
问题是,数据可以是单个或多维数组:

// single:
\'SINGLE\' => array(
    // some data
)
// multidimensional:
\'MULTI\' => array(
     0 => array(
         // some data
     )
     1 => array(
         // some data
     )
)
Question: 在不知道是否有单个或多维数组且不创建另一个回调函数的情况下,循环遍历其中一个数组(在回调函数中)的数据的最简单方法是什么?

In other words: 如何编写递归过滤器回调?

2 个回复
最合适的回答,由SO网友:Anh Tran 整理而成

虽然你的答案很有趣,我也很喜欢,但我还是想发布另一个建议,让你有另一个选择:)

IMHO,如果数据只包含简单字段,如:

array(
    \'name\' => \'my name\',
    \'address\' => \'my address\',
    \'phone\' => \'01234\',
);
然后可以使用以下代码:

add_filter( \'wpse63692_example_filter\', \'wpse63692_example_cb\' );

function wpse63692_example_cb( $data )
{
    foreach ( $data as $key => $value )
    {
        // Recursively apply filters to sub array
        if ( is_array( $value ) )
            $data[$key] = apply_filters( current_filter(), $value );
    }

    // Do something with $data

    return $data;
}

SO网友:kaiser

这就是我目前所发现的。

这个trick 我使用的是一个不存在的2-nd参数,名为$recursive 确定我是否处于递归循环中。默认值为false, 所以$is_multiple 循环被触发。然后我经过一个true 对于函数调用,禁止通过可能存在的子数组进行循环。

之所以可以这样做,唯一的原因是当我的函数的参数比apply_filters()

function wpse63692_example_cb( $data, $recursive = false )
{
    $result = $data;
    if ( 1 < count( $data ) AND ! $recursive )
    {
        $result = array();
        foreach ( $data as $key => $value )
            $result[ $key ] = call_user_func( __FUNCTION__, $value, true );
    }

    return $result;
}
add_filter( \'wpse63692_example_filter\', \'wpse63692_example_cb\' );

结束

相关推荐

调用Function_Exist()比调用Apply_Filters()快还是慢

调用函数\\u exists()时,应用\\u filters()的速度是快还是慢。。。还是差异太小,不应该考虑?我在Kaiser的基础上做了一些测试,结果表明,在同时存在函数和过滤器的情况下,function\\u exists()的速度大约是3倍。如果过滤器不存在,速度将提高约11倍。没想到会这样。function taco_party() { return true; } add_filter( \'taco-party\', \'taco_party\'