2017-08-23 47 views
0

私は以下のPHPコードで配列を持っています。この配列をデータ値でグループ化するように変換します。配列を単純化することは常に困難です。日付でPHP配列グループ

オリジナル配列:以下

Array 
    (
    [0] => Array 
     (
      [date] => 2017-08-22 
      [AAA] => 1231 
     ) 
    [1] => Array 
     (
      [date] => 2017-08-21 
      [AAA] => 1172 
     ) 
    [2] => Array 
     (
      [date] => 2017-08-20 
      [AAA] => 1125 
     ) 
    [3] => Array 
     (
      [date] => 2017-08-21 
      [BBB] => 251 
     ) 
    [4] => Array 
     (
      [date] => 2017-08-20 
      [BBB] => 21773 
     ) 
    [5] => Array 
     (
      [date] => 2017-08-22 
      [CCC] => 3750 
     ) 
    [6] => Array 
     (
      [date] => 2017-08-20 
      [CCC] => 321750 
     ) 
) 

は私の希望の配列である:

Array 
    (
    [2017-08-22] => Array 
     (
      [AAA] => 1231 
      [CCC] => 3750 
     ) 
    [2017-08-21] => Array 
     (
      [AAA] => 1172 
      [BBB] => 251 
     ) 
    [2017-08-20] => Array 
     (
      [AAA] => 1125 
      [BBB] => 21773 
      [CCC] => 321750 
     ) 
) 

データが存在しない場合は、空のNULL値を持つこともokです。 2017-08-22の場合は[BBB] => NULLです。 誰でも助けることができますか?事前のおかげで...

+6

あなたのコードを投稿してください。 –

+1

[多次元配列を特定の値でグループ化する]の可能な複製?(https://stackoverflow.com/questions/2189626/group-a-multidimensional-array-by-a-particular-value) – Tomasz

+1

試してみました。 – ksjohn

答えて

2

単純なループは、ここでは、この..

$group = []; 
foreach ($data as $item) { 
    if (!isset($group[$item['date']])) { 
     $group[$item['date']] = []; 
    } 
    foreach ($item as $key => $value) { 
     if ($key == 'date') continue; 
     $group[$item['date']][$key] = $value; 
    } 
} 
+0

AAAとCCCはどうですか? – RiggsFolly

+0

@RiggsFolly彼らは_so_2016です。 –

+0

@ MagnusEriksson lol - yeah – Philipp

1

を実行する必要があります。これは、作業を行う必要があります。

$dst_array = array(); 
foreach ($array as $outerval) { 
    foreach ($outerval as $key => $innerval) { 
     if ($key != 'date') { 
      $dst_array[$outerval['date']][$key] = $innerval; 
     } 
    } 
} 

これは、各サブアレイのエントリを順番に処理します。日付ではないものは、その日付に対応するサブ配列の宛先配列とそれ自身の現在のキーで割り当てられます。

0

私はこのソリューションは、あなたのために働くだろうと信じて:

<?php 
$array = Array 
(
    0 => Array 
    (
     'date' => '2017-08-22', 
     'AAA' => '1231', 
    ), 
    1 => Array 
    (
     'date' => '2017-08-21', 
     'AAA' => '1172', 
    ), 
    2 => Array 
    (
     'date' => '2017-08-20', 
     'AAA' => '1125' 
    ), 
    3 => Array 
    (
     'date' => '2017-08-21', 
     'BBB' => '251' 
    ), 
    4 => Array 
    (
     'date' => '2017-08-20', 
     'BBB' => '21773', 
    ), 
    5 => Array 
    (
     'date' => '2017-08-22', 
     'CCC' => '3750' 
    ), 
    6 => Array 
    (
     'date' => '2017-08-20', 
     'CCC' => '321750' 
    ) 
); 
echo '<pre>'; 
$array1 = array('AAA' => null, 'BBB' => null, 'CCC' => null); 
$array2 = array(); 

array_walk($array, function ($v) use (&$array2, $array1) { 
    $a = $v['date']; 
    if (!isset($array2[$a])) { 
     $array2[$a] = $array1; 
    } 
    unset($v['date']); 
    $array2[$a] = array_merge($array2[$a], $v); 
}); 

print_r($array2); 

出力

Array 
(
    [2017-08-22] => Array 
     (
      [AAA] => 1231 
      [BBB] => 
      [CCC] => 3750 
     ) 

    [2017-08-21] => Array 
     (
      [AAA] => 1172 
      [BBB] => 251 
      [CCC] => 
     ) 

    [2017-08-20] => Array 
     (
      [AAA] => 1125 
      [BBB] => 21773 
      [CCC] => 321750 
     ) 

) 

チェック出力時:https://3v4l.org/NvLB8

+0

ありがとう.. – Jace

0

別のアプローチ(汚い&速い)を利用します配列内部ポインタ:

$newArray = []; 
foreach ($array as $childArray) { 
    $date = current($childArray); 

    $value = next($childArray); // this advances the internal pointer.. 
    $key = key($childArray);  // ..so that you get the correct key here 

    $newArray[$date][$key] = $value; 
} 

これはもちろん、指定された配列構造でのみ動作します。

0

PHP関数array_reduce()ためのもう一つの完璧な使用例:

// The input array 
$input = array(
    0 => array(
     'date' => '2017-08-22', 
     'AAA' => '1231', 
    ), 
    // The rest of your array here... 
); 


$output = array_reduce(
    $input, 
    function (array $carry, array $item) { 
     // Extract the date into a local variable for readability and speed 
     // It is used several times below 
     $date = $item['date']; 
     // Initialize the group for this date if it doesn't exist 
     if (! array_key_exists($date, $carry)) { 
      $carry[$date] = array(); 
     } 

     // Remove the date from the item... 
     // ...and merge the rest into the group of this date 
     unset($item['date']); 
     $carry[$date] = array_merge($carry[$date], $item); 

     // Return the partial result 
     return $carry; 
    }, 
    array() 
); 

質問が明確ではありません。 2つ以上の日付に1つのキー(AAA f.e)が存在する場合、どのような結果が得られますか?この回答は、それに関連付けられた最後の値のみを保持します。

関連する問題