人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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の種類や数はデータベースにアクセスするタイミングで変わります。
よろしくお願いいたします。

●質問者: sunsunpapa
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● うぃんど
●140ポイント ベストアンサー

一例

<?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 ● oil999
●10ポイント

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

<?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 />';
}
?>

うぃんどさんのコメント
>> $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 '; for ($i = 0; $i < $n; $i++) { echo $id[$i] . ',' . $data[$i] . ',' . $sort[$i] . ',' . $sum[$i] . ' '; } << 質問文のような結果になりますか? ポイント欲しさのいいかげん回答でないなら書き直しましょう。 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

oil999さんのコメント
id:windofjuly 様は質問者でもないのに、なぜ私に批判的な態度をとられるのですか? 回答冒頭に「質問にある求めたい結果が、質問にある主旨と違うような気がします」と記しているように、このスクリプトで表示されるのは「質問にある求めたい結果」の通りではありません。 失礼ながら、id:windofjuly 様の示されたスクリプトにしても、「質問にある求めたい結果」とは違うではありませんか。

うぃんどさんのコメント
>「質問にある求めたい結果」とは違うではありませんか。 自分のまちがいにこちらまで引き込む気ですか? 「質問にある求めたい結果」が「dの番号ごとにdataの数値を集計し、 idが最初に出現する行に、集計した数値を表示したい」以外に何があると?

3 ● sloto
●50ポイント

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

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することで変更を反映させることができます。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ