我正在寻找一个简单的方法/函数来告诉我一个数组是否只包含其他数组,或者是否也包含值。例如
$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_map
与is_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);
}
这与你的版本的语义略有不同,但我认为它们更正确(如果它首先不是一个数组,它很难是数组的数组,不是吗?)。
这个公式可以说更优雅,但差异很小,我可能会在实际代码中使用循环。