1

我正在使用以下数组并将其分块为 3 个项目的较小数组array_chunk

$array = array('1', '1', '1', '', '', '', '3', '3', '3', '4', '4', '4');

以下函数和每个语句...

function preserve($value){
    if ($value != '') {
        return TRUE;
    } else {
        return FALSE;
    }
}

$chunk = array_chunk($array, 3, true);

foreach ($chunk as $value){
    $chunk = array_filter($value, 'preserve');  

    if($chunk){
        $separated = implode("|", $chunk);
        echo $separated . '<br/>';
    }
}

...丢弃产生此结果的数组中的空值:

1|1|1
3|3|3
4|4|4

下一个,

如果数组看起来像这样:

$array = array('1', '1', '1', '', 'A', '', '3', '3', '3', '4', '4', '4');

结果如下所示:

1|1|1
A
3|3|3
4|4|4

当我需要结果看起来像:

1|1|1
 |A|
3|3|3
4|4|4

无论如何array_filter,如果数组块的所有值都是空的,并且如果不保留这些值同时仍然内爆那些为空的值,如上面结果的最后输出所示,我是否可以使用它来仅删除数组块?

4

2 回答 2

1

内爆原始的$value,而不是过滤的:

$separated = implode("|", $value);

您仅用于array_filter检查数组是否所有 3 个项目都为空

于 2013-01-22T11:52:47.087 回答
1

您想根据过滤后的内部数组过滤外部数组,而不是内部数组本身。即这样:

$chunks = array_filter($chunks, function($values) {
    return count(array_filter($values, 'preserve')) > 0;
});

编辑:还更改您的保留功能以进行类型安全比较

return $value !== '';

因为否则像“0”这样的项目也将被视为空。如果这是您的意图,您也可以省略preserve并使用默认过滤器。

于 2013-01-22T11:53:21.907 回答