2016-01-30 127 views
2

合併不同的值我有一個數組:濾波器2名維陣列和PHP

$arr = [ 
    ['id'=>1, 'name'=>'Peter', 'age'=>28], 
    ['id'=>1, 'name'=>'David', 'age'=>28], 
    ['id'=>2, 'name'=>'John', 'age'=>34], 
    ['id'=>3, 'name'=>'Smith', 'age'=>36], 
    ['id'=>3, 'name'=>'Smith', 'age'=>28], 
]; 

欲通過柱的「id」過濾它,併合並不同的值。我需要輸出:

$arr = [ 
    ['id'=>1, 'name'=>'Peter,David', 'age'=>28], 
    ['id'=>2, 'name'=>'John', 'age'=>34], 
    ['id'=>3, 'name'=>'Smith', 'age'=>'36,28'] 
]; 

是否有任何PHP函數(如:array_filter,array_walk,array_map,...)要做到這一點,沒有下文循環的代碼?

function combine_row($arr){ 
    $last = null; 
    foreach ($arr as $key => $a){ 
     if ($a['id']==$last['id']){ 
      foreach ($a as $k=>$v) { 
       if($v!==$last[$k]) { 
        $arr[$key][$k].=','.$last[$k]; 
       } 
      } 
      unset($arr[$key-1]); 
     } 
     $last = $a; 
    } 
    return $arr; 
} 

感謝您的幫助!

+0

Phong,你解決了嗎?讓我知道如果我應該對我的答案進行更改 – Michael

+0

對不起,邁克爾,我沒有回來查看您的答案,因爲我找到了通過使用Group_concat從mysql中修復它的方法。無論如何,你的答案是如此完美。我將其標記爲已接受的答案。謝謝! –

回答

0

下面是一個使用了更實用的風格的解決方案。基本上只有很多內置的array_*功能。這將確保較少的副作用,使您的代碼更容易出錯。

代碼首先找到所有唯一的_id_s。然後它會過濾數據並最終加入它。

$result = array_map(
    function ($id) use ($arr) { 
     return array_map(function ($data) { 
       if (is_array($data)) return join(",", array_unique($data)); 
       return $data; 
      }, array_reduce(
       array_filter($arr, function ($item) use ($id) { return $id === $item["id"]; }), 
       function ($result, $set) { return $result = array_filter(array_merge_recursive($result, $set)); }, [ ] 
      ) 
     ); 
    }, 
    array_unique(array_column($arr, "id")) 
); 

print_r($result); 

輸出:

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [name] => Peter,David 
      [age] => 28 
     ) 

    [2] => Array 
     (
      [id] => 2 
      [name] => John 
      [age] => 34 
     ) 

    [3] => Array 
     (
      [id] => 3 
      [name] => Smith 
      [age] => 36,28 
     ) 

) 

使用a chainable apigithub可以實現更可讀的代碼:

$result = arr($arr) 
    ->column("id") 
    ->unique() 
    ->map(
     function ($id) use ($arr) { 
      return arr($arr) 
       ->filter(function ($item) use ($id) { return $id === $item["id"]; }) 
       ->reduce(function ($result, $set) { return array_filter(array_merge_recursive($result, $set)); }, []) 
       ->map(function ($data) { 
        if (is_array($data)) return arr($data)->unique()->join(",")->toArray(); 
        return $data; 
       })->toArray(); 
     } 
    )->toArray(); 
-2

試試這個

function merge_multidimensional($arr) { 
$out = array(); 
foreach ($arr as $key => $value){ 
    $out[] = (object)array_merge((array)$arr2[$key], (array)$value); 
} 
return $out; 

}

+0

我試過了,但沒有幫助 –

-1

入住這下面的代碼,

function getMergerArray($arr) { 
    $newArr = array(); 
    foreach ($arr as $key => $value) { 
     $id = $value['id']; 
     $name = $value['name']; 
     $age = $value['age']; 
     if (array_key_exists($id, $newArr)) { 
      if (!in_array($name, $newArr[$id]['name'])) { 
       $newArr[$id]['name'][] = $name; 
      } 
      if (!in_array($age, $newArr[$id]['age'])) { 
       $newArr[$id]['age'][] = $age; 
      } 
      continue; 
     } 
     $newArr[$id]['name'][] = $name; 
     $newArr[$id]['age'][] = $age; 
    } 
    foreach ($newArr as $key => $value) { 
     $newArr[$key] = array(
      'id' => $key, 
      'name' => implode(', ', $value['name']), 
      'age' => implode(', ', $value['age']), 
     ); 
    } 
// echo '<pre>'; 
// print_r($newArr); 
// echo '</pre>'; 
    return $newArr; 
} 
+0

嗨@deceze,爲什麼這個答案被投票了?原因將在未來發布新答案時幫助我,並將幫助引用此答案的其他人。先謝謝你 :) –

0
$result = []; 
foreach ($arr as $person) { 
    foreach ($person as $key => $value) { 
     if ($key == 'id') { 
      $result[$person['id']][$key] = $value; 
     } else { 
      $result[$person['id']][$key][] = $value; 
     } 
    } 
} 

魔術真的是$result[$person['id']],該羣體具有相同的所有項目id很自然地進入相同的結果數組。這也爲多個值創建了數組,而不是僅僅連接字符串,這是一個非常好用的數據結構。如果你只想要唯一的值,請在那裏輸入array_unique。如果您確實需要用逗號加入項目,請在末尾使用join(',', ..)