如何在PHP中检查一个数组是否只包含其他数组


How to check if an array contains only other arrays in PHP?

我正在寻找一个简单的方法/函数来告诉我一个数组是否只包含其他数组,或者是否也包含值。例如

$a = array(array(), array(), array())

应该以'true'结果结束,但是

$b = array(array(), 1, 17)

应该以"false result"结束。

我知道我可以做以下事情,

function isArrayOfArrays($a) {
    foreach ($a as $value) {
        if (!is_array($value))
            return false;
    }
    return true;
}

我想知道是否有更优雅的方式。

您可以尝试使用array_filter:

$isArrayOfArrays = empty( array_filter($b, function($item){
  return !is_array($item);
}) );

或者更短:

$isArrayOfArrays = array_filter($b, 'is_array') === $b;

您也可以尝试array_mapis_array,并查看in_array是否所有元素都为真:

print_r(!in_array(0, array_map(is_array, $a)));

基本上,is_array$a的每个元素执行,因此您得到一个布尔值数组。然后检查这个新数组是否都为真

我喜欢高阶函数和map-reduce范式:

/**
 * && as a function.
 *
 * This is our reducer.
 */
function andf($a, $b)
{
    return $a && $b;
}
function isArrayOfArrays($a)
{
    if (!is_array($a)) {
        return false;
    }
    return array_reduce(array_map('is_array', $a), 'andf', true);
}

这与你的版本的语义略有不同,但我认为它们更正确(如果它首先不是一个数组,它很难是数组的数组,不是吗?)。

这个公式可以说更优雅,但差异很小,我可能会在实际代码中使用循环。