如何在 gridview yii2 中合并两个或多个列时跳过空列

How to Skip empty columns while merging two or more columns in gridview yii2

首先我有这样的看法

查看:

'label' => 'xxx',
'encodeLabel' => False,
'value' => function($q) use ($aaa, $bbb){
           $c = isset($bbb[$q->something->classId]) ? $bbb[$q->something->classId] : "";
           $d = isset($aaa[$q->something->familyId]) ? $aaa[$q->something->familyId] : "";
           return  $c . "." . $d . "." . $q->something->someName . "." . $q->something->someName;
},
'attribute' => 'xxx',
'filter' => $yyy,

我想做的是,

我将四列合并为一列。 结果如下所示:x.y.z.a 当某列为空时,它看起来像:x..z.a

我需要: 当显示合并值时,如果某些列有一个空值而不是像这样的输出:x..z.a 我想避免 space 当它们为空时,像这样:x.z.a

预期结果:

x.z.a 而不是 x..z.a

如何更改或更新我的代码以获得预期的结果?

使用 implode()http://php.net/implode,可选择结合一些过滤。

function($q) use ($aaa, $bbb){
    return implode('.', array_filter([
        $bbb[$q->something->classId] ?? null,
        $aaa[$q->something->classId] ?? null,
        $q->something->someName,
        $q->something->someName

    ]);
}

这不是 Yii2 或 gridview 特定的。

注意 null coalesce 运算符,我在这里使用它的方式相当于 isset($a) ? $a : $b.

\yii\helpers\ArrayHelper::merge()implode() 一起使用,您可以在一行中完成。

关于\yii\helpers\ArrayHelper

递归地将两个或多个数组合并为一个数组。

如果每个数组都有一个字符串键值相同的元素,则后者会覆盖前者(不同于array_merge_recursive)。如果两个数组都具有数组类型的元素并且具有相同的键,则将进行递归合并。对于整数键元素,后一个数组中的元素将附加到前一个数组中。您可以使用 yii\helpers\UnsetArrayValue object to unset value from previous array or yii\helpers\ReplaceArrayValue 强制替换以前的值而不是递归合并。

假设我有以下数组,$b 是一个空数组,我想将它们全部合并。

$a = ['a'];
$b = [];
$c = ['c'];
$d = ['d'];

echo implode('.',\yii\helpers\ArrayHelper::merge($a, $b, $c, $d));

以上代码会输出a.c.d

除上述所有方法外,如果您想使用它从数组中提取单个列的值,也可以使用 ArrayHelper::getColumn() 获取列内列出的所有值。表示可以使用 ArrayHelper::getColumn().

从数组中提取上面使用的数组 $a,$b,$c and $d
$array = [
    ['id' => '123', 'data' => 'abc'],
    ['id' => '345', 'data' => 'def'],
];
$result = ArrayHelper::getColumn($array, 'id');
// the result is: ['123', '345']

即使您的默认 frontend/web/index.php 文件也有这些行来合并文件中的配置数组。

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/../../common/config/main.php'),
    require(__DIR__ . '/../../common/config/main-local.php'),
    require(__DIR__ . '/../config/main.php'),
    require(__DIR__ . '/../config/main-local.php')
);