0

次のような配列があるとします。

array(100) {
  [0]=>
  array(4) {
    ["player_id"]=>
    string(2) "jk"
    ["date"]=>
    string(10) "2012-11-07"
    ["hits"]=>
    string(4) "1000"
  }
  [1]=>
  array(4) {
    ["player_id"]=>
    string(2) "jk"
    ["date"]=>
    string(10) "2012-11-14"
    ["hits"]=>
    string(4) "2000"
  }
 [2]=>
  array(4) {
    ["player_id"]=>
    string(2) "mc"
    ["date"]=>
    string(10) "2012-11-14"
    ["hits"]=>
    string(4) "1500"
  }
 [3]=>
  array(4) {
    ["player_id"]=>
    string(2) "mc"
    ["date"]=>
    string(10) "2012-11-07"
    ["hits"]=>
    string(4) "2300"
  }

...

そして、これは続きます。つまり、基本的には複数のプレーヤーがいて、各プレーヤーに対して 2 つの日付があります。私はこのような配列になりたいと思います:

array(100) {
      ["jk"]=>
      array(2) {
        ["hits_today"]=>
        string(4) "1000"
        ["hits_difference"]=>
        string(5) "-1000"
      }
     ["mc"]=>
      array(2) {
        ["hits_today"]=>
        string(4) "1500"
        ["hits_difference"]=>
        string(4) "-800"
      }
    ..

基本的に、最初の配列を処理して、各プレーヤーに 2 つの値があることを認識し、キーとして player_id を使用し、これら 2 つの値の差と今日の値をコンポーネントとして使用する配列の配列を作成します。

私の懸念は次のとおりです。

  • 最初の配列を処理する最良の方法は何ですか?
  • 今日の価値が存在しない場合、または明日の価値が存在しない場合、どのように対処しますか? 配列の処理中にそれを制御するにはどうすればよいですか?
4

2 に答える 2

0

計算されている現在の日付がすでに手元にある日付よりも大きいか<大きいかを判断するために、出力配列に日付を保存する必要がありましたが、これが私が思いついた解決策です:

$array = array(
    array("player_id" => "jk", "date" => "2012-11-07", "hits" => "1000"),
    array("player_id" => "jk", "date" => "2012-11-14", "hits" => "2000"),
    array("player_id" => "mc", "date" => "2012-11-14", "hits" => "1500"),
    array("player_id" => "mc", "date" => "2012-11-07", "hits" => "2300")
);

$output = array();
foreach($array as $k=>$v){
    if(!isset($output[$v['player_id']])){
        $output[$v['player_id']]['hits_today'] = $v['hits'];
        $output[$v['player_id']]['hits_difference'] = 0;
        $output[$v['player_id']]['date'] = $v['date'];
    }elseif($v['date'] < $output[$v['player_id']]['date']){
        $output[$v['player_id']]['hits_difference'] = $output[$v['player_id']]['hits_today'] - $v['hits'];
    }elseif($v['date'] > $output[$v['player_id']]['date']){
        $output[$v['player_id']]['hits_difference'] = $output[$v['player_id']]['hits_today'] - $v['hits'];
        $output[$v['player_id']]['hits_today'] = $v['hits'];
        $output[$v['player_id']]['date'] = $v['date'];
    }
}
echo '<pre>';
print_r($output);
echo '</pre>';
?>
于 2012-11-14T14:25:03.970 に答える
0

これがクエリからのものである場合は、代わりに次のようにします。

SELECT player_id,
SUM(IF(`date`='$yesterday', hits, 0)) AS hits_yesterday,
SUM(IF(`date`='$today', hits, 0)) AS hits_today
FROM ...
GROUP BY player_id
于 2012-11-14T14:25:08.047 に答える