【问题标题】:How to replicate multidimensional subarray values according to conditions?如何根据条件复制多维子数组值?
【发布时间】:2020-06-29 20:28:40
【问题描述】:

我有一个这样的array

Array
(
[05049207256] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 05049207256
                [CID] => 29113082
                [GROUP_ID] => 
                [B_CODE] => 10152/6277
            )

        [1] => Array
            (
                [ID_NUMBER] => 05049207256
                [CID] => 29093574
                [GROUP_ID] => 
                [B_CODE] => 10241/6244
            )

    )

[16992375298] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 16992375298
                [CID] => 29112537
                [GROUP_ID] => 398242
                [B_CODE] => 10152/6277
            )

        [1] => Array
            (
                [ID_NUMBER] => 16992375298
                [CID] => 29112169
                [GROUP_ID] => 398223
                [B_CODE] => 10152/6276
            )

    )

[21871540019] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 21871540019
                [CID] => 29112605
                [GROUP_ID] => 398048
                [B_CODE] => 10152/6277
            )

        [1] => Array
            (
                [ID_NUMBER] => 21871540019
                [CID] => 29113036
                [GROUP_ID] => 398040
                [B_CODE] => 10152/6277
            )

        [2] => Array
            (
                [ID_NUMBER] => 21871540019
                [CID] => 29112733
                [GROUP_ID] => 398039
                [B_CODE] => 10152/6277
            )

        [3] => Array
            (
                [ID_NUMBER] => 21871540019
                [CID] => 29110803
                [GROUP_ID] => 398039
                [B_CODE] => 10152/6275
            )

    )

[19897986583] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 19897986583
                [CID] => 29112613
                [GROUP_ID] => 
                [B_CODE] => 10152/6277
            )

        [1] => Array
            (
                [ID_NUMBER] => 19897986583
                [CID] => 29111627
                [GROUP_ID] => 
                [B_CODE] => 10152/6276
            )

    )

[21228943839] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 21228943839
                [CID] => 29112573
                [GROUP_ID] => 398250
                [B_CODE] => 10152/6277
            )

        [1] => Array
            (
                [ID_NUMBER] => 21228943839
                [CID] => 29111947
                [GROUP_ID] => 3982505
                [B_CODE] => 10152/6276
            )
            
        [2] => Array
            (
                [ID_NUMBER] => 21228943839
                [CID] => 29111947
                [GROUP_ID] => 
                [B_CODE] => 10152/6276
            )

    )

)

我想重新排列其中的一些内容: 如果array只有一个子数组,不管'GROUP_ID'值,删除它:

[80388889886] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 80388889886
                [CID] => 29122690
                [GROUP_ID] =>           --> some value or empty value
                [B_CODE] => 10152/6295
            )

    )

如果array 有两个或多个子数组,并且存在至少一个“GROUP_ID”值(如果有多个 GROUP_ID,则可以使用一个随机 GROUP_ID 值),取该值并将其分配给其中的所有其他 GROUP_ID子数组,无论是否存在现有或空的 GROUP_ID 值, (除非数组也有两个或多个子数组,并且子数组中的所有 GROUP_ID 值都为空,否则保持它们为空):

[85225663143] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 85225663143
                [CID] => 29098209
                [GROUP_ID] =>
                [B_CODE] => 10241/6244
            )

        [1] => Array
            (
                [ID_NUMBER] => 85225663143
                [CID] => 29122764
                [GROUP_ID] => 399676
                [B_CODE] => 10152/6295
            )

    )
    

到:

[85225663143] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 85225663143
                [CID] => 29098209
                [GROUP_ID] => 399676
                [B_CODE] => 10241/6244
            )

        [1] => Array
            (
                [ID_NUMBER] => 85225663143
                [CID] => 29122764
                [GROUP_ID] => 399676
                [B_CODE] => 10152/6295
            )

    )
    

或:

[92723208008] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 29134479
                [GROUP_ID] => 399733
                [B_CODE] => 10304/6332
            )

        [1] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 29122696
                [GROUP_ID] => 399764
                [B_CODE] => 10152/6295
            )
            
        [2] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 2912665
                [GROUP_ID] => 399777
                [B_CODE] => 10152/6295
            )

    )
    

到:

[92723208008] => Array
    (
        [0] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 29134479
                [GROUP_ID] => 399733
                [B_CODE] => 10304/6332
            )

        [1] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 29122696
                [GROUP_ID] => 399733
                [B_CODE] => 10152/6295
            )
            
        [2] => Array
            (
                [ID_NUMBER] => 92723208008
                [CID] => 2912665
                [GROUP_ID] => 399733
                [B_CODE] => 10152/6295
            )

    )

我已经解决了第一个问题,但是我在第二部分中的情况没有按预期工作,这是我的代码:

foreach ($result as $key => $val) {
    foreach ($val as $key1 => $val1) {
            if (count(array_keys($val)) == 1) {                 
                unset ($result[$key]);
            }
                    
            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;
            }
    }
}

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 您能否将此示例输入数据显示为var_export,好吗?这使人们更容易获得一个可以使用的工作示例。
  • 我想我会先在第一个 foreach 级别使用array_column,从子数组中提取GROUP_ID 值。 count 是 1?然后我们得到了您的第一个案例,只有一个子数组,所以这是您要删除/取消设置的元素。接下来,将array_unique 应用于这些值。如果 that 的计数再次为 1,and 值是“空”(无论这实际上意味着什么 - 空字符串、null、false?) - 那么我们有你的情况其中 all GROUP_ID 为空,在这种情况下无事可做。 […]
  • [...] 如果计数 not 1,那么您至少有两个不同的组 ID。选择一个(确保它不是空的),并应用于所有子数组元素。
  • 嗯,输入数据来自 sql 查询,该查询的输出是问题开头的数组。
  • “并且该查询的输出是问题开头的数组” - 是的,但其格式难以转换为有效的 PHP 代码。请为它创建一个var_export,它将生成我们可以通过复制和粘贴获取的PHP代码,以便我们可以立即使用。

标签: php multidimensional-array


【解决方案1】:

如之前在 cmets 中所述,我的方法是这样的:

$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;
        }
    }
  }
}

为了清楚起见,我把 // do nothing if 留在了那里 - 当然也可以重写,否定整个条件,并使当前的 else 分支编码为 if 分支。

【讨论】:

    【解决方案2】:

    这是一个仅使用 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]);
        }
    }
    

    【讨论】:

      【解决方案3】:
      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 是 true,,那么第二个将是 false,虽然形式上是正确的,但最好将其形式化以提高可读性。

      我不检查 else 中的 GROUP_ID 是否为空

      无论子数组的第一个元素是否具有空的 GROUP_ID,第二个元素都可能是非空的。因此,与其检查子数组中的第一项是否具有非空 GROUP_ID,不如检查子数组中的任何项是否为非空,因为这是真实情况

      检查是否有非空的GROUP_ID需要一个循环

      $GROUP_ID 初始化后的那一点,我们不知道子数组中是否至少有一个非空的 GROUP_ID。结果,我们循环遍历子数组,如果我们找到一个非空的 GROUP_ID,那么我们记下它并停止循环。

      确定我们是否需要覆盖 GROUP_ID

      如果$GROUP_ID 为真,这意味着我们已经覆盖了它的初始值null,或者换句话说,这意味着我们找到了一个非空的GROUP_ID。

      覆盖元素

      如果我们将子数组中的所有 GROUP_ID 值覆盖为我们找到的值,则在最后一个内部。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        • 2019-10-18
        • 2023-03-26
        • 1970-01-01
        • 2017-06-07
        • 2014-08-17
        • 2021-10-27
        相关资源
        最近更新 更多