2016-07-15 7 views
1

同じ日付に基づいて重複する配列値グループを削除しようとしています(1つのグループのみ保持)。グループ内で多次元配列の重複をフィルタリングします

また、 "1"キー(pidキーの上)の番号を取り出し、グループ化されたグループと一緒に追加します。

imは、「時間」セクションの下にある重複グループでフィルタリングすることを想定しています。ここで

が始まる配列イムです:

ここ
Array(
    [1488] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 37 
          [pid] => 1488 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 51 
          [pid] => 1488 
         ) 

        [2] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 44 
          [pid] => 1488 
         ) 

        [3] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 22 
          [pid] => 1488 
         ) 

       ) 

     ) 

    [2] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 9.5 
          [pid] => 2 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 8 
          [pid] => 2 
         ) 

        [2] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 7 
          [pid] => 2 
         ) 

        [3] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 5 
          [pid] => 2 
         ) 

       ) 

     ) 

) 

私はそれのように見えるために必要なもの:

Array(
    [0] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 37 
          [pid] => 1488 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 117 
          [pid] => 1488 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 24.5 
          [pid] => 2 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 5 
          [pid] => 2 
         ) 

       ) 

     ) 

) 

これは私のコードです:

$temp_array = array(); 
    $w = 0; 
    $key_array = array(); 

    $new_array = array(); 

    foreach($project_hours as $old_arrs) { 


      foreach ($old_arrs["hours"] as $val) { 
       if (!in_array($val[0], $key_array)) { 
        $key_array[$w] = $val[0]; 
        $temp_array[$w] = $val; 

       } else { 
        $ser = array_search($val[0], $key_array); 
        $temp_array[$ser][1] += $val[1]; 
       } 

       $w++; 

       $old_arrs["hours"] = $temp_array; 

      } 


     $new_array[] = $old_arrs; 
    } 

    echo '<pre>'; 
    print_r($new_array); 
    echo '</pre>'; 
+2

をあなたにもちょうど '[1を追加し、指標として、その' isset'場合は '[0]'値を使用することができ、この配列を構築する場合] '一緒に。 –

答えて

1

あなただけ行うことができます配列キーを整理するための単純なトリックを使用し、次に2つの領域でarray_values()を使用して、関連キーをnにリセットしますumericキー:

// Your array 
$data = array(
    1488 => array(
     'hours' => array(
      0 => array(
       0 => '2016/07/11 - 2016/07/17', 
       1 => 37, 
       'pid' => 1488, 
      ), 
      1 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 51, 
       'pid' => 1488 
      ), 
      2 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 44, 
       'pid' => 1488 
      ), 
      3 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 22, 
       'pid' => 1488 
      ) 
     ) 
    ), 
    2 => array(
     'hours' => array(
      0 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 9.5, 
       'pid' => 2 
      ), 
      1 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 8, 
       'pid' => 2 
      ), 
      2 => array(
       0 => '2016/07/04 - 2016/07/10', 
       1 => 7, 
       'pid' => 2 
      ), 
      3 => array(
       0 => '2016/07/11 - 2016/07/17', 
       1 => 5, 
       'pid' => 2 
      ) 
     ) 
    ) 
); 

// Loop through array... 
foreach($data as $pid => $group) { 
    foreach($group['hours'] as $row) { 
     // I am using the date as a unique key so it's easy to organize 
     $new[$pid]['hours'][$row[0]][0] = $row[0]; 
     // This will draw an warning if you don't first check that it's set 
     if(!isset($new[$pid]['hours'][$row[0]][1])) 
      $new[$pid]['hours'][$row[0]][1] = 0; 
     // Add values together as you go 
     $new[$pid]['hours'][$row[0]][1]  += $row[1]; 
     // On each loop this just assigns the pid (it just keeps overwriting itself 
     // but that is no big deal) 
     $new[$pid]['hours'][$row[0]]['pid'] = $pid; 
    } 
    // Here since you are not using date keys, just reset to numeric 
    $new[$pid]['hours'] = array_values($new[$pid]['hours']); 
} 

print_r(array_values($new)); 

があなたに与える:

Array 
(
    [0] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 37 
          [pid] => 1488 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 117 
          [pid] => 1488 
         ) 

       ) 

     ) 

    [1] => Array 
     (
      [hours] => Array 
       (
        [0] => Array 
         (
          [0] => 2016/07/04 - 2016/07/10 
          [1] => 24.5 
          [pid] => 2 
         ) 

        [1] => Array 
         (
          [0] => 2016/07/11 - 2016/07/17 
          [1] => 5 
          [pid] => 2 
         ) 

       ) 

     ) 

) 
+0

あなたは命の恩人です。 –

+0

実際、私は@JonathanKuhnのコメントを読んでいます。彼は本質的に私がやったことを提案したので、彼は最初にアイデアを持っていた! – Rasclatt

関連する問題