search

Home  >  Q&A  >  body text

php - 数组重新组合

1,如何将数组arr1转化成arr2?

arr1 = [

['tracking1','abc@qq.com','80'],
['tracking1','abc@qq.com','50'],
['tracking2','efg@qq.com','60'],
['tracking2','efg@qq.com','30'],

];

arr2 = [

['tracking1','abc@qq.com',['80','50']],
['tracking2','efg@qq.com',['60','30']],

];

PHPzPHPz2896 days ago361

reply all(5)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 17:27:06

    思路很简单,就是把数组的第一和第一列的值作为一个唯一key写入,感觉楼上代码有点多,简洁代码如下

    $arr1 = [
        ['tracking1','abc@qq.com','80'],
        ['tracking1','abc@qq.com','50'],
        ['tracking2','efg@qq.com','60'],
        ['tracking2','efg@qq.com','30'],
    ];
    
    $arr2 = [];
    foreach ($arr1 as $data) {
        list($account,$mail,$val) = $data;
        isset($arr2[$account.$mail]) || $arr2[$account.$mail]=[$account,$mail,[]];
        array_push($arr2[$account.$mail][2],$val);
    }
    $arr2 = array_values($arr2);
    var_dump($arr2);

    reply
    0
  • PHPz

    PHPz2017-04-10 17:27:06

    我给个思路,先遍历判断arr1[0]是否一样,一样就往一个新数组中插入,在这基础判断[1]是否相同,相同就插入值,不同则合并成一个数组,以此类推

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:27:06

    $arr = [['tracking1','abc@qq.com','80'],
    ['tracking1','abc@qq.com','50'],
    ['tracking2','efg@qq.com','60'],
    ['tracking2','efg@qq.com','30']];
    
    $finalArr = [[[]]];
    $mailArr =[];
    foreach ($arr as $k=>$v){
        $mailKey = array_search($v[1],$mailArr);
        if($mailKey!==false){
            array_push($finalArr[$mailKey][2],$v[2]);
        }else{
            $finalArr[$k] = $v;
            $finalArr[$k][2] = [$v[2]];
            $mailArr[$k]=$v[1];
        }
    }
    $finalArr = array_values($finalArr);
    var_dump($finalArr);
    

    14行功能代码,不要太简单。

    reply
    0
  • PHPz

    PHPz2017-04-10 17:27:06

    说下我的思路,题主这个数组,拆分开其实就是两个部分,每个数组里的v0、v1值,和v2值。

    $new = array(); 
    $flag = 1;
    foreach ($arr as $key => $value) {
      $newss[$value[0].'-'.$value[1]][] = $value[2];  //取出重复小标0 1的值 
      $news = array($value[0], $value[1]);
      foreach ($new as $k => $v) {
        if(!array_diff($v,$news )) { //如果
          $flag = 2;
          break;
        }
      }
      if($flag == 1) {
        $new[] = array($value[0], $value[1]);
      }
      $flag = 1;
    }
    foreach ($new as $key => $value) {
      $new[$key][2] = $newss[$value[0].'-'.$value[1]];
    }
    var_dump($new);exit;

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:27:06

        $arr1 = [    
            ['tracking1','abc@qq.com','80'],
            ['tracking1','abc@qq.com','50'],
            ['tracking2','efg@qq.com','60'],
            ['tracking2','efg@qq.com','30'],
        ];
        
        $arr2 = [
            ['tracking1','abc@qq.com',['80','50']],
            ['tracking2','efg@qq.com',['60','30']],
        ];
    
        define("CUSTOM_SEPA", "_");
    
        function t($a0){
            $r = [];
            $res = [];
            foreach($a0 as $v){
                $r[$v[0].CUSTOM_SEPA.$v[1]][] = $v[2];
            }
            foreach($r as $k=>$v){
                $s = explode(CUSTOM_SEPA, $k);
                $s[] = $v;
                $res[] = $s;
            }
            return $res;
        }
    
        $res = t($arr1);
        print_r($res == $arr2);

    reply
    0
  • Cancelreply