3 回答
TA贡献1824条经验 获得超5个赞
我的方法是这样的:
$result = […]; // your input data
foreach( $result as $key => $item ) {
// get group IDs for current item
$group_ids = array_column( $item, 'GROUP_ID' );
// if count is 1, remove item
if( count( $group_ids ) == 1 ) {
unset( $result[$key] );
}
else {
// get only unique group IDs
$group_ids_unique = array_unique( $group_ids );
// is there is only one unique group ID, and it is empty?
if( count( $group_ids_unique ) == 1 && !$group_ids_unique[0] ) {
// do nothing
}
else {
// get one “random” group id - either the 1st, or if that is empty, the 2nd one
$group_id_set = $group_ids_unique[0] ? $group_ids_unique[0] : $group_ids_unique[1];
// set that group ID for all entries in current item
foreach( $item as $sub_key => $sub_value ) {
$result[$key][$sub_key]['GROUP_ID'] = $group_id_set;
}
}
}
}
为了清楚起见,我把 the// do nothing if留在那里——当然,也可以重写它,否定整个条件,并使当前的 else 分支编码为 if 分支。
TA贡献1853条经验 获得超6个赞
这是一个简单的解决方案,仅使用array_column
foreach($result as $key => $array){
if(count($array) >= 2){
$group_ids = array_column($array,'GROUP_ID');//get all group_ids
foreach($group_ids as $k => $v){
if(!empty($v)){//if there is non-empty one change the values and break the loop
foreach($array as $key2 => $array2){
$result[$key][$key2]['GROUP_ID'] = $v;
}
break;
}
}
}else{
unset($result[$key]);
}
}
TA贡献1817条经验 获得超14个赞
foreach ($result as $key => $val) {
if (count(array_keys($val)) == 1) {
unset ($result[$key]);
} else if (count(array_keys($val)) >= 2/* && empty($result[$key][$key1]['GROUP_ID'])*/) {
/*$assign_value = $val[0]['GROUP_ID'];
$result[$key][$key1]['GROUP_ID'] = $assign_value;*/
$GROUP_ID = null;
for ($index = 0; ($GROUP_ID) && ($index < count($val)); $index++) {
if ((isset($val["GROUP_ID"])) && (!!$val["GROUP_ID"])) {
$GROUP_ID = $avl["GROUP_ID"];
}
}
if (!!$GROUP_ID) {
for ($index = 0; $index < count($val); $index++) {
$val["GROUP_ID"] = $GROUP_ID;
}
}
}
}
删除了 if 周围的内部 for 循环
if 不需要在它周围使用循环,我们可以确定数组内的项目数而无需循环它们。
第二个if修改为else-if
虽然在这种情况下,如果第一个if
为真,,
那么第二个将是false
,这在形式上是正确的,但最好使其正式化以获得更好的可读性。
我不检查 else 中 GROUP_ID 是否为空
无论子数组的第一个元素是否具有空 GROUP_ID,第二个元素都可能非空。因此,您不需要检查子数组中的第一个项目是否具有非空 GROUP_ID,而是需要检查子数组中的任何项目是否为非空,因为这是真实条件
检查是否有非空GROUP_ID需要循环
初始化后,$GROUP_ID
我们不知道子数组中是否至少有一个非空的 GROUP_ID。因此,我们循环遍历子数组,如果找到非空 GROUP_ID,则记录下来并停止循环。
确定是否需要覆盖 GROUP_ID
如果$GROUP_ID
为 truey,则意味着我们已经覆盖了它的初始值,即null
,或者换句话说,这意味着我们找到了一个非空的 GROUP_ID。
覆盖元素
在最后一个内部,如果我们将子数组中的所有 GROUP_ID 值覆盖为我们找到的值。
- 3 回答
- 0 关注
- 157 浏览
添加回答
举报