考虑到下面的数组,我如何取消设置键1到7都为null的子数组。我似乎无法在脑海中想象如何迭代,或者是否有一个函数已经可以处理它了。
$x = array(
(int) 1 => array(
'name' => 'Platemaking',
(int) 1 => null,
(int) 2 => null,
(int) 3 => null,
(int) 4 => null,
(int) 5 => null,
(int) 6 => null,
(int) 7 => null
),
(int) 2 => array(
'name' => 'Digital Printing',
(int) 1 => null,
(int) 2 => '40.0%',
(int) 3 => null,
(int) 4 => null,
(int) 5 => null,
(int) 6 => null,
(int) 7 => null
),
);
例如,在这种情况下,$x
应该只有一个元素,即子数组索引2
预期结果如下:
$x = array(
(int) 2 => array(
'name' => 'Digital Printing',
(int) 1 => null,
(int) 2 => '40.0%',
(int) 3 => null,
(int) 4 => null,
(int) 5 => null,
(int) 6 => null,
(int) 7 => null
),
);
只取至少有一个元素不是NULL 的项
$result = array_filter($x, function($val) { unset($val['name']); return array_filter($val);});
print_r($result);
更新如果听欺骗,做另一个版本的
$result = array_filter($x, function($val) {
return array_filter(array_intersect_key($val, array_flip(range(1,7))));});
print_r($result);
$x = array_filter($x, function (array $sub) {
return array_reduce(range(1, 7), function ($notEmpty, $i) use ($sub) {
return $notEmpty || $sub[$i] !== null;
});
});
CCD_ 2决定是保留该数组还是丢弃该数组;回调返回键1
到7
中的任何一个是否不为空(如果不为空,则保留,否则丢弃(,它通过reduce
将range(1, 7)
中的键根据它们中的任何是否为!== null
转换为布尔值来实现这一点。
如果数组格式不变:
foreach ( $x as &$val ) {
$val = array_filter($val);
}
foreach通过引用在数组上迭代,array_filter在没有回调的情况下将消除"false"值
找到了一个相当粗糙的解决方案,但它可以
$result = array();
foreach ($tmp as $k => $v){
$i = 0;
if(!((empty($v[++$i]))&&(empty($v[++$i])) && (empty($v[++$i])) && (empty($v[++$i]))&&(empty($v[++$i])) && (empty($v[++$i])) &&
(empty($v[++$i])))){
$result[$k] = $v;
}
}
return $result;