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

问题描述 投票:0回答:1

我有这样的数组,

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

实现这一目标的最佳方法是什么?

php arrays multidimensional-array
1个回答
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
,则打印
Null
的值,
False 
0
:您可以在每个
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 );
        }
    }
}

上面的函数就像第一个代码,但即使在深度更少或更多的数组上也能工作。它使用 hidden 第二个参数来打印所有钥匙链。您可以通过添加,即函数的参数来轻松更改它:

function deepInArray( $array, $checkLevel )

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

请注意:

1. 在这两个例子中,我都不考虑值是对象的情况,所以 - 如果发生这种情况,如果对象不是 __asString() 方法,脚本就会失败; 2. 任何一个示例都旨在在命令行中运行;如果你通过浏览器运行它,你会得到一个更好的输出,改变所有带有 `
` 标签的 `PHP_EOL`。
© www.soinside.com 2019 - 2024. All rights reserved.