2017-03-23 9 views
0

申し訳ありませんが、私はこの問題のための適切なスレッドのタイトルを書くのは難しいです。 ここに私の質問です:非常に複雑なSQLデータの結果PHP(Multi Dimensional Arrays)によるマージ

要するに:どのように配列アイテムをマージして計算します。

ここでは詳しい説明

1だ)私は統計を追跡するために(WPカスタム)データベースがあります:セッション数、ユニークセッション数、など、それが日ごとにポストごとに保存されていますが。

理解しやすくする。ここでは、テーブルのスクリーンショットです:

Stats MySQL Table

2)これは私がそれを照会すると、データ例である:

https://gist.github.com/turtlepod/8e7dc93bae7f0b665fd5aea8a9694998

したがって、この例では、我々は複数のポストIDを持っています: " 「2017-03-21」、「2017-03-21」、「2017-03-22」

の複数の日付があります。

複数の統計情報:「訪問数」と「unique_visits」

各項目には「stat_value」もあります。

各項目には一意のIDがあります。

イベントが発生すると、すべてのデータが動的に作成されます。すべてのpost_idに2つの統計情報または上記の日付があるわけではありません。

注:実際のコードでは、上記の例よりも多くのデータとバリエーションがあります。

3)私は、データをマージする必要があります。

post_idのは、「121」は、ポスト「231」と同じであるので、我々は合併して一つのデータに「stat_value」を追加し、削除する必要があります」 231 "エントリ。

PHPでこれを(動的に)行うには、どのような方法が最適ですか?

$raw_data = array(...); // the one in github gist 
$post_groups = array(
    '121' => array('121', '231'), // main post_id => array of alias. 
); 

それは$ RAW_DATAと同じデータ形式を返しますが、「231」のデータを削除し、インクルードする必要があり/合計」を「231」の「stat_value」:

私はこのデータを持っています121 "となる。

ありがとうございます。

function david_transform_data($data, $groups) { 
    if (empty($groups) === true) { 
    return $data; 
    } 

    // Transform groups into a more useful format 
    $transformed_groups = array(); 
    foreach ($groups as $post_id => $aliases) { 
    foreach ($aliases as $alias) { 
     if (absint($post_id) === absint($alias)) { 
     continue; 
     } 

     $transformed_groups[absint($alias)] = $post_id; 
    } 
    } 

    // Replace aliases with the real post id 
    foreach ($data as $index => $stat) { 
    if (isset($transformed_groups[absint($stat->post_id)]) === false) { 
     continue; 
    } 

    $data[$index]->post_id = $transformed_groups[absint($stat->post_id)]; 
    } 

    // Go through stats and merge those with the same post_id, stat_id 
    // and stat_date 
    $merged_stats = array(); 
    $index_tracker = 0; 
    $stats_hash = array(); 

    foreach ($data as $index => $stat) { 
    $hash_key = sprintf(
     '%s-%s-%s', 
     $stat->post_id, 
     $stat->stat_id, 
     $stat->stat_date 
    ); 
    if (isset($stats_hash[$hash_key]) === true) { 
     $merged_stats[$stats_hash[$hash_key]]->stat_value += absint($stat->stat_value); 
     continue; 
    } 

    $merged_stats[] = $stat; 
    $stats_hash[$hash_key] = $index_tracker; 
    $index_tracker++; 
    } 

    return $merged_stats; 
} 

var_dump(david_transform_data($raw_data, $post_groups)); 

速く解決策があるかもしれませんが、これは私の心に来た最初のものです:

+0

post_idを変更するだけでなく、サンプルデータに変更する必要はありません。右? –

+0

同じstat_idと日付が –

答えて

1

はこれで試してみてください。

+0

WOWの場合は、post_id (基本的に統計値をマージ)に別名post_idを計算/合計/追加する必要があります。そりゃ素晴らしい!私はそれが正常に動作していると思う。 –

+0

ありがとうございました。ほんとうにありがとう。 –