什么是检查空的multidimentional数组的最佳方法,multidimentional数组的特定空值?

时间:2016-02-02 08:10:40

标签: php arrays multidimensional-array

我有这样的数组,

Array
(
  [120] => Array
    (
        [1] => Array
            (
                [0] => Array
                    (
                        [name] => quantity_1_120
                        [value] => 
                    )

                [1] => Array
                    (
                        [name] => single_1_120
                        [value] => 
                    )
            )

        [2] => Array
            (
                [0] => Array
                    (
                        [name] => quantity_2_120
                        [value] => 
                    )

                [1] => Array
                    (
                        [name] => single_2_120
                        [value] => 
                    )

            )

    )

现在,我想检查一下

1)value的所有120是否为空。

2)如果没有,则在密钥1,2

中检查所有值是否为空

3)并且可能是这一个被收集,必须检查所有value是否为空而不是name=single_2_120中的1,2

实现这一目标的最佳方式是什么。

1 个答案:

答案 0 :(得分:0)

由于不清楚你需要对阵列进行何种检查和/或操作,这是一个粗鲁,丑陋的解决方案:

foreach( $array as $mainKey => $mainVal )
{
    if( !$mainVal )
    { echo "[$mainKey] EMPTY".PHP_EOL; }
    elseif( !is_array($mainVal) )
    { echo "[$mainKey] $mainVal".PHP_EOL; }
    else
    {
        foreach( $mainVal as $mediumKey => $mediumVal )
        {
            if( !$mediumVal )
            { echo "[$mainKey][$mediumKey] EMPTY".PHP_EOL; }
            elseif( !is_array($mediumVal) )
            { echo "[$mainKey][$mediumKey] $mediumVal".PHP_EOL; }
            else
            {
                foreach( $mediumVal as $mediumKey1 => $mediumVal1 )
                {
                    if( !$mediumVal1 )
                    { echo "[$mainKey][$mediumKey][$mediumKey1] EMPTY".PHP_EOL; }
                    elseif( !is_array($mediumVal1) )
                    { echo "[$mainKey][$mediumKey][$mediumKey1] $mediumVal1".PHP_EOL; }
                    else
                    {
                        foreach( $mediumVal1 as $key => $val )
                        {
                            if( !$val )
                            { echo "[$mainKey][$mediumKey][$mediumKey1][$key] EMPTY".PHP_EOL; }
                            elseif( !is_array($val) )
                            { echo "[$mainKey][$mediumKey][$mediumKey1][$key] $val".PHP_EOL; }
                            else
                            { echo "[$mainKey][$mediumKey][$mediumKey1][$key] array({count($val)})".PHP_EOL; }
                        }
                    }
                }
            }
        }
    }
}

它执行4个嵌套foreach,每个级别的数组一个,并测试内容:如果它是一个数组,请执行下一个foreach,否则打印EMPTY的值如果值为NullFalse0:您可以在每个if / else语句中添加代码。

single_x_120的检查是更深层次的(mediumVal1)。

但是还有一个更好的解决方案,具有像这样的递归函数:

function deepInArray( $array )
{
    if( 1<func_num_args() )
    { $chain = array_merge(func_get_arg(func_num_args()-1), array(key($array))); }
    else $chain = array( key($array) );
    $curChain = array_slice( $chain,0,count($chain)-1 );

    foreach( $array as $key => $val )
    {
        if( !$val )
        { echo (($curChain)?'['.implode('][',$curChain).']':'')."[$key] EMPTY".PHP_EOL; }
        elseif( !is_array($val) )
        { echo (($curChain)?'['.implode('][',$curChain).']':'')."[$key] $val".PHP_EOL; }
        else
        {
            deepInArray( $val, $chain );
        }
    }
}

eval.in demo

上面的函数就像第一个代码一样,但即使在深度越来越小的数组上也能工作。它使用隐藏第二个参数来打印所有键链。您可以通过向函数添加参数来轻松更改它:

function deepInArray( $array, $checkLevel )

在您喜欢的级别执行检查,或添加代码以返回布尔值而不是打印支票。

请注意:

  1. 在任何一个示例中,我都不考虑值是对象的情况,因此 - 如果发生这种情况,如果对象不是__asString()方法,则脚本会失败;
  2. 这两个示例都打算在命令行中运行;如果您通过浏览器运行它,则会获得更好的输出,并使用PHP_EOL标记更改所有<br>