如何在 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')
);
首先我有这样的看法
查看:
'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')
);