phpのプログラムについて教えてください。

データベースにアクセスをして次のようなデータを取得し、配列に格納しています。

id,data,sort
----------
1,10,1
2,20,2
1,12,3
3,25,4
2,10,5
1,14,6
3,5,7

$id=array(1,2,1,3,2,1,3);
$data=array(10,20,12,25,10,14,5);


idの番号ごとにdataの数値を集計し、
idが最初に出現する行に、集計した数値を表示したいのですが、
どのように記述すれば、いいでしょうか?


求めたい結果は、下記のようになります。

id 1 の集計値は、10+12+14=36
id 2 の集計値は、20+10=30
id 3 の集計値は、25+5=30

id,data,sort,sum
----------
1,10,1,36
2,20,2,30
1,12,3
3,25,4,30
2,10,5
1,14,6
3,5,7

$id=array(1,2,1,3,2,1,3);
$data=array(10,20,12,25,10,14,5);
$sum=array(36,30,,30,,,);

上記のデータはあくまでサンプルです。
idの種類や数はデータベースにアクセスするタイミングで変わります。
よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/03/16 11:26:23
  • 終了:2013/03/18 11:07:10

ベストアンサー

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/03/16 12:31:59

ポイント140pt

一例

<?php
// データ
$id = array(1,2,1,3,2,1,3);
$data = array(10,20,12,25,10,14,5);
$sort = array(1,2,3,4,5,6,7);
// 集計準備
$cnt = count($id);
$sort_min = array();
$sum = array();
// 集計
for ( $i =0; $i < $cnt; $i++ ) {
    if (!isset( $sort_min[$id[$i]] )) $sort_min[$id[$i]] = $sort[$i];
    $sum[$id[$i]] += $data[$i];
}
// 出力
for ( $i =0; $i < $cnt; $i++ ) {
    echo $id[$i];
    echo ':';
    echo $data[$i];
    echo ':';
    echo $sort[$i];
    echo ':';
    echo ( $sort[$i] == $sort_min[$id[$i]] ? $sum[$id[$i]] : '--');
    echo "\n";
}

出力結果

1:10:1:36
2:20:2:30
1:12:3:--
3:25:4:30
2:10:5:--
1:14:6:--
3:5:7:--

その他の回答(2件)

id:windofjuly No.1

うぃんど回答回数2625ベストアンサー獲得回数11492013/03/16 12:31:59ここでベストアンサー

ポイント140pt

一例

<?php
// データ
$id = array(1,2,1,3,2,1,3);
$data = array(10,20,12,25,10,14,5);
$sort = array(1,2,3,4,5,6,7);
// 集計準備
$cnt = count($id);
$sort_min = array();
$sum = array();
// 集計
for ( $i =0; $i < $cnt; $i++ ) {
    if (!isset( $sort_min[$id[$i]] )) $sort_min[$id[$i]] = $sort[$i];
    $sum[$id[$i]] += $data[$i];
}
// 出力
for ( $i =0; $i < $cnt; $i++ ) {
    echo $id[$i];
    echo ':';
    echo $data[$i];
    echo ':';
    echo $sort[$i];
    echo ':';
    echo ( $sort[$i] == $sort_min[$id[$i]] ? $sum[$id[$i]] : '--');
    echo "\n";
}

出力結果

1:10:1:36
2:20:2:30
1:12:3:--
3:25:4:30
2:10:5:--
1:14:6:--
3:5:7:--
id:oil999 No.2

oil999回答回数1728ベストアンサー獲得回数3202013/03/16 12:38:50

ポイント10pt

質問にある求めたい結果が、質問にある主旨と違うような気がします。
下記のスクリプトをお試しください。

<?php
$id = array(1,2,1,3,2,1,3);
$data = array(10,20,12,25,10,14,5);
$sum = array();

//集計用配列の初期化
$hoge = array();
for ($i = 0; $i < $n; $i++)  $hoge[$i] = 0;

//集計
$n = count($id);
for ($i = 0; $i < $n; $i++)  $hoge[$id[$i]] += $data[$i];

//配列$sumに代入
for ($i = 0; $i < $n; $i++)  $sum[$i] = $hoge[$id[$i]];

//結果表示
echo 'id,data,sort,sum<br />';
for ($i = 0; $i < $n; $i++) {
    echo $id[$i] . ',' . $data[$i] . ',' . $sort[$i] . ',' . $sum[$i] . '<br />';
}
?>
他1件のコメントを見る
id:oil999

id:windofjuly 様は質問者でもないのに、なぜ私に批判的な態度をとられるのですか?

回答冒頭に「質問にある求めたい結果が、質問にある主旨と違うような気がします」と記しているように、このスクリプトで表示されるのは「質問にある求めたい結果」の通りではありません。

失礼ながら、id:windofjuly 様の示されたスクリプトにしても、「質問にある求めたい結果」とは違うではありませんか。

2013/03/16 13:41:24
id:windofjuly

>「質問にある求めたい結果」とは違うではありませんか。

自分のまちがいにこちらまで引き込む気ですか?

「質問にある求めたい結果」が「dの番号ごとにdataの数値を集計し、
idが最初に出現する行に、集計した数値を表示したい」以外に何があると?

2013/03/16 13:53:12
id:sloto No.3

sloto回答回数49ベストアンサー獲得回数62013/03/17 17:38:31

ポイント50pt

たとえばデータがこんな感じですと、

id,data,sort
----------------
1,10,1
2,20,2
1,12,3
3,25,4
2,10,5
1,14,6
3,5,7
8,6,8
15,7,9
12,29,10
8,32,11
5,1,12


以下のコードを実行することによって、

<?php
$id=array(1,2,1,3,2,1,3,8,15,12,8,5);
$data=array(10,20,12,25,10,14,5,6,7,29,32,1);


function transverse_matrix($array){
  return call_user_func_array('array_map',array_merge(array(null),$array));
}

$unique=array_unique($id);
$sum=array();

$table=array($id,$data);
$table=transverse_matrix($table);

foreach($unique as $u){
   foreach($table as $t){
      if($u == $t[0]){
      $sum[$u]+=$t[1];
      }
   }
}

print_r($sum);
?>

-----------------------
こういう結果が得られます。

//配列sumの中身
Array
(
    [1] => 36
    [2] => 30
    [3] => 30
    [8] => 38
    [15] => 7
    [12] => 29
    [5] => 1
)

たとえばid=8の合計を得たい場合は、echo $sum[8]; とすれば38がでます。
仮にidがcatとかdogであっても……つまりデータベースが

id,data,sort
----------------
cat,10,1
2,20,2
cat,12,3
dog,25,4
3,5,5


みたいな形式であっても、上のプログラムを使えば
echo $sum['cat'];とすれば 4が出力されます。

使用しているのがmysqlであれば、updateすることで変更を反映させることができます。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません