【问题标题】:Merge/Combine filtered ID with same key value in array - Unique in Multidimensional - PHP合并/组合过滤后的 ID 与数组中的相同键值 - 多维中唯一 - PHP
【发布时间】:2016-09-06 19:34:45
【问题描述】:

我有一个数组的多维结果,其中包含数组对象的数量,需要通过唯一 id 在数组中应用过滤器以进行复制并将其他过滤后的 id 与数组的相同键值对合并/组合。像下面想要的结果

这需要服务。

结果集

Array
(
    [0] => Array
        (
            [id] => 24901
            [course_title_code] => VTM 001
            [instructors_name] => Master_Al_Za
            [course_code] => 8734
            [unique_id] => VTM_001_8734_Master_Al_Za
        )

    [1] => Array
        (
            [id] => 25669
            [course_title_code] => VTM 002
            [instructors_name] => Ali_Al
            [course_code] => 8732
            [unique_id] => VTM_002_8732_Ali_Al
        )

    [2] => Array
        (
            [id] => 26011
            [course_title_code] => VTM 002
            [instructors_name] => Ali_Al
            [course_code] => 8732
            [unique_id] => VTM_002_8732_Ali_Al
        )

    [3] => Array
        (
            [id] => 29502
            [course_title_code] => VTM 001
            [instructors_name] => Master_Al_Za
            [course_code] => 8734
            [unique_id] => VTM_001_8734_Master_Al_Za
        )

    [4] => Array
        (
            [id] => 49202
            [course_title_code] => VTM 001
            [instructors_name] => Master_Al_Za
            [course_code] => 8734
            [unique_id] => VTM_001_8734_Master_Al_Za
        )    

)

期望的结果

Array
(
    [0] => Array
        (
            [id] => 24901,29502,49202
            [course_title_code] => VTM 001
            [instructors_name] => Master_Al_Za
            [course_code] => 8734
            [unique_id] => VTM_001_8734_Master_Al_Za
        )

    [1] => Array
        (
            [id] => 25669,26011
            [course_title_code] => VTM 002
            [instructors_name] => Ali_Al
            [course_code] => 8732
            [unique_id] => VTM_002_8732_Ali_Al
        )
)

我当前的实现尝试做这样的事情:

$data = array_unique_by_key($data, 'unique_id');

function array_unique_by_key (&$array, $key) {
    $tmp = array();
    $result = array();
    foreach ($array as $p => $value) {
        if (!in_array($value[$key], $tmp)) {
            array_push($tmp, $value[$key]);
            array_push($result, $value);
        }else{
            $result[$p] = $value['id'];
        }
    }
    return $array = $result;
}

【问题讨论】:

  • 这似乎来自数据库,不是吗?
  • 上述代码的输出是什么?
  • 是的数据来自数据库,但我不能应用这个结束 @Quasimodo'sclone 的逻辑
  • 为什么不呢?您没有访问 SQL 的权限吗?
  • 它返回了我过滤的 ID,但没有合并 @SyedMohamedAladeen

标签: php arrays multidimensional-array merge unique


【解决方案1】:

你就快到了,只需要根据唯一值在新数组中附加值,

如果key已经存在则追加id,否则追加整个数组

如果需要,使用 array_values 将键更新为数字

$x = array(
    0 => array
        (
            'id' => '24901',
            'course_title_code' => 'VTM 001',
            'instructors_name' => 'Master_Al_Za',
            'course_code' => '8734',
            'unique_id' => 'VTM_001_8734_Master_Al_Za',
        ),

    1 => array
        (
            'id' => '25669',
            'course_title_code' => 'VTM 002',
            'instructors_name' => 'Ali_Al',
            'course_code' => '8732',
            'unique_id' => 'VTM_002_8732_Ali_Al',
        ),

    2 => array
        (
            'id' => '26011',
            'course_title_code' => 'VTM 002',
            'instructors_name' => 'Ali_Al',
            'course_code' => '8732',
            'unique_id' => 'VTM_002_8732_Ali_Al',
        ),

    3 => array
        (
            'id' => '29502',
            'course_title_code' => 'VTM 001',
            'instructors_name' => 'Master_Al_Za',
            'course_code' => '8734',
            'unique_id' => 'VTM_001_8734_Master_Al_Za',
        ),

    4 => array
        (
            'id' => '49202',
            'course_title_code' => 'VTM 001',
            'instructors_name' => 'Master_Al_Za',
            'course_code' => '8734',
            'unique_id' => 'VTM_001_8734_Master_Al_Za',
        )    

);
$data = array_unique_by_key($x, 'unique_id');

function array_unique_by_key (&$array, $key) {
    $result = array();
    foreach ($array as $p => $value) {
        if (!array_key_exists($value[$key], $result)) {
            $result[$value[$key]] = $value;
        }else{
            $result[$value[$key]]['id'] .= ',' . $value['id'];
        }
    }
    return array_values($result);
}

print_r($data);

输出:

Array
(
    [0] => Array
        (
            [id] => 24901,29502,49202
            [course_title_code] => VTM 001
            [instructors_name] => Master_Al_Za
            [course_code] => 8734
            [unique_id] => VTM_001_8734_Master_Al_Za
        )

    [1] => Array
        (
            [id] => 25669,26011
            [course_title_code] => VTM 002
            [instructors_name] => Ali_Al
            [course_code] => 8732
            [unique_id] => VTM_002_8732_Ali_Al
        )

)

【讨论】:

    【解决方案2】:

    产生所需的精确输出。用逗号连接重复值:

    function mergeArrayOnKey($array, $key){
        $keychain = $ret = array();
        foreach($array as $a){
            if(!isset($a[$key])) continue;
            if(!in_array($a[$key], $keychain)){
                array_push($keychain, $a[$key]);
                array_push($ret, $a);
            }else{
                // Get sub array
                foreach($ret as $k=>$r){
                    if($r[$key] == $a[$key]){
                        foreach($a as $kk=>$vv){
                            $oldvals = explode(",",$r[$kk]);
                            if(in_array($vv, $oldvals)) continue;
                            array_push($oldvals,$vv);
                            $r[$kk] = implode(",",$oldvals);
                        }
                    }
                    $ret[$k] = $r;
                }
            }
        }
        return $ret;
    }
    

    这是一个小提琴:https://3v4l.org/4DNgt

    输出:

    Array
    (
        [0] => Array
            (
                [id] => 24901,29502,49202
                [course_title_code] => VTM 001
                [instructors_name] => Master_Al_Za
                [course_code] => 8734
                [unique_id] => VTM_001_8734_Master_Al_Za
            )
    
        [1] => Array
            (
                [id] => 25669,26011
                [course_title_code] => VTM 002
                [instructors_name] => Ali_Al
                [course_code] => 8732
                [unique_id] => VTM_002_8732_Ali_Al
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      这可能是解决方案。我只测试 3 个值,请检查并告诉我。有一些偏移警告,忽略它们。

      Online Check,您可以在线查看。

      数组:

      $arr = array(
          array(
              "id" => 24901,
              "course_title_code" => "VTM 001",
              "instructors_name" => "Master_Al_Za",
              "course_code" => 8734,
              "unique_id" => "VTM_001_8734_Master_Al_Za"
          ),
          array(
              "id" => 25669,
              "course_title_code" => "VTM 002",
              "instructors_name" => "Ali_Al",
              "course_code" => 8732,
              "unique_id" => "VTM_002_8732_Ali_Al"
          ),
          array(
              "id" => 26011,
              "course_title_code" => "VTM 002",
              "instructors_name" => "Ali_Al",
              "course_code" => 8732,
              "unique_id" => "VTM_002_8732_Ali_Al"
          )
      );
      

      机制:

      $out = array();
      $uni_key = array();
      foreach($arr as $key => $val){
          $srch = array_search($val['unique_id'], $uni_key);
          if($srch > -1){
              $out[$srch]['id'] .= $out[$key]['id'].", ".$val['id'];
          }else{
              array_push($uni_key, $val['unique_id']);
              $out[$key] = $val;      
          }       
      }
      
      echo '<pre>';
      print_r($out);
      

      结果:

      Array
      (
          [0] => Array
              (
                  [id] => 24901
                  [course_title_code] => VTM 001
                  [instructors_name] => Master_Al_Za
                  [course_code] => 8734
                  [unique_id] => VTM_001_8734_Master_Al_Za
              )
      
          [1] => Array
              (
                  [id] => 25669, 26011
                  [course_title_code] => VTM 002
                  [instructors_name] => Ali_Al
                  [course_code] => 8732
                  [unique_id] => VTM_002_8732_Ali_Al
              )
      
      )
      

      【讨论】:

      • 无法正常工作它让我在$out[$srch]['id'] .= $out[$key]['id'].", ".$val['id']; 的某些状态下发出警告
      • @QueryMaster 我已经说过有一些警告,你可以在变量前设置一些isset@。我必须说这会奏效。我在网上查了。
      • 我在网上检查过,但没有正确过滤,请您从我的在线 id 3v4l.org/OQLaG检查一下
      • @QueryMaster,知道了。使用if($srch &gt; -1) 而不是if($srch)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多