• 締切済み

配列同士を結合させて、計算させる方法

例えば、以下のような2つの配列があったとします。 $array1 = Array( [0] => Array( [primarykey] => 1 [username] => takeo [math] => 87 [his] => 90 ) [1] => Array( [primarykey] => 2 [username] => youko [math] => 69 [his] => 56 ) ) $array2 = Array( [0] => Array( [username] => youko [math] => 75 [his] => 89 ) [1] => Array( [username] => takeo [math] => 65 [his] => 37 ) $array1に$array2のデータを入れていくような、上手い方法は無いでしょうか? $array2の[username] => takeoの[math] => 35を$array1の[username] => takeoの[math] => 87に足して、最終的に[math] => 122としたいのです。 array_mergeはダメだし、do~while、foreach、色々と考えているのですが……。 どなたか助けて下さい! お願いします。

みんなの回答

  • wp_
  • ベストアンサー率54% (132/242)
回答No.4

>もし該当するとしたら[username]でしょうか。 group by しているのであればusernameが無難でしょうね。 設計者側からしてみればprimary_keyを一意にしろよ!なんでしょうけど^^; >インターフェイスは触るなというお達しが出ているんです。 そんなプロジェクトは窓から捨ててしまいましょう^^;;;; 使えないインターフェースを書いた奴を見せしめにするために全社MLに屑ソースを流すとか!(やめれ おそらく肥大化したソースの所為で改修すると不具合連発なんでしょうけど。 一から書き直すプロジェクトを発足してみたらどうですか^^; まぁ現実としてどうしようもないでしょうから、コピーコピーでソートして上書きしかないんじゃないですかねぇorz 配列のコピーすら禁止とか言ったらお手上げですが^^; 三角定規で円を書けと言ってるのと同じことですし。円を書くならコンパスが必要ですよ、と。 >そのうち、ソースの耐震偽装が発覚しますよw 誰が上手いこと言えとw >デスノートにソースを書いてやろうか ソースが死んぢゃうw

ken_716
質問者

お礼

>wp_さん いつもありがとうございます。 御蔭で、完全に佳境は越えました。 感謝してもし尽くせないです。 ありがとうございました!!

  • wp_
  • ベストアンサー率54% (132/242)
回答No.3

>とあるプロジェクトに参加していまして、もう前任者を恨みます。 それは・・・・^^;;;; ご愁傷様としかいえませんな・・・・^^;;;; // まるで自分を見ているようだ // というかこの業界はマトモな奴の方が少ないのかとorz >$array2はDBから取得したものです ということはマスタっぽいものが既にあるのかと思いますが、 >foreachで$array2を分解して、$array1[$i]と一致すれば足していく……が現在のベストでしょうか。 とするより、DBからマスタを取得する際に配列のキーをusernameにし、 配列キーをusernameにした$array1のコピーを用意、 DB($array2)の値でforeachして値を付加し、 array_multisort()でソートを行い出力とするのがスマートかなぁと思います。 50件程度だったら仮想テーブル作るよりかはそんなに重くないかと。 まぬある array_multisort() http://jp2.php.net/manual/ja/function.array-multisort.php // もうね、コード書いてお金もらう人間って免許制にすると良いと思うんですよ。

ken_716
質問者

お礼

>wp_ レスありがとうございます。 >>とあるプロジェクトに参加していまして、もう前任者を恨みます。 >それは・・・・^^;;;; >ご愁傷様としかいえませんな・・・・^^;;;; >// まるで自分を見ているようだ >// というかこの業界はマトモな奴の方が少ないのかとorz 同じ境遇ですか……orz もし前任者が現在参加しているプロジェクトマネージャだったら、本当に全く同じ境遇ですねw >>$array2はDBから取得したものです >ということはマスタっぽいものが既にあるのかと思いますが、 DB構造自体、かなり複雑で、この$array2の他に、実は$array10くらいあります。 最終的に$array2~10まで数値を$array1に足せばOKって感じです。 で、マスタっぽいものですが、もし該当するとしたら[username]でしょうか。叩いているSQL文も、全てusernameでGROUP BYしています。 >とするより、DBからマスタを取得する際に配列のキーをusernameにし、 >配列キーをusernameにした$array1のコピーを用意、 >DB($array2)の値でforeachして値を付加し、 >array_multisort()でソートを行い出力とするのがスマートかなぁと思います。 >50件程度だったら仮想テーブル作るよりかはそんなに重くないかと。 ですよね。。。。 ただ、 >DBからマスタを取得する際に配列のキーをusernameにし、 DBからSELECTしたデータは二次元配列で出てくるのですが、配列のキーは弄れんのです....orz 今回は操作画面の改修が主なので、インターフェイスは触るなというお達しが出ているんです。 もう、本当に、デスノートにソースを書いてやろうか、と。 > まぬある array_multisort() ​> http://jp2.php.net/manual/ja/function.array-multisort.php​ おっ、これは便利そうですね。 ありがとうございます。参考にさせて頂きます。 // もうね、コード書いてお金もらう人間って免許制にすると良いと思うんですよ。 そのうち、ソースの耐震偽装が発覚しますよw

  • wp_
  • ベストアンサー率54% (132/242)
回答No.2

一番理想的なのはマスタとする配列と結合する配列のキーを揃えることです。 そうすればforeach文が一つで済みます。 // 普通はそうなるように設計します。 またデータの取り出し元はDBかCSVか分かりませんが、 DBであればorder文でソートした物を取り出すべきですし、 CSVであれば初期化時に全てのデータのキーを一意で共通な物にすべきです。 そうすることで「mathでソートしたときの順番のキー」といった一時データの作成と それを元にしてマスタ情報から必要な項目を引っ張ることが容易になります。 つまるところ、「最初から作り直すのがベスト」 今あるデータをこねくり回すより 今あるデータをどうにかする、 としたほうがが往々にして早く解決します。 よって具体的なソースは挙げません。

ken_716
質問者

お礼

>wp_さん レスありがとうございます。 // 普通はそうなるように設計します。 ですよね。。。。 とあるプロジェクトに参加していまして、もう前任者を恨みます。 データですが、$array2はDBから取得したものです。ORDER BY usernameをしています。$array1はデフォルトで用意されているもので、これが二次元配列になっているからややこしいと思っています....orz foreachで$array2を分解して、$array1[$i]と一致すれば足していく……が現在のベストでしょうか。 1日経っても、まだ悩んでいます。。。。

  • wp_
  • ベストアンサー率54% (132/242)
回答No.1

何と何が紐付くのか確固としたことが分からないので usernameで紐付けてみましたが。 array_walkを使う方法もありますけどね・・・・ それ以前に、$array1がマスタであるのなら、連想配列のキーは連番でなく 一意のキー(この場合はprimary key? username?)にすべきでしょう。 とりあえず以下に無理矢理紐付けたソースを書いてみます。 $array1 = Array(  0=> Array(   'primarykey' => 1   ,'username' => 'takeo'   ,'math' => 87   ,'his' => 90  )  ,1 => Array(   'primarykey' => 2   ,'username' => 'youko'   ,'math' => 69   ,'his' => 56  ) ); $array2 = Array(  0 => Array(   'username' => 'youko'   ,'math' => 75   ,'his' => 89  )  ,1 => Array(   'username' => 'takeo'   ,'math' => 65   ,'his' => 37  ) ); $buf = array(); foreach($array1 as $num => $value) {  $buf[ $value['username'] ] = $value; } foreach($array2 as $num => $addValue) {  $username = $addValue['username'];  $buf[$username]['math'] = $buf[$username]['math'] + $addValue['math'];  $buf[$username]['his'] = $buf[$username]['his'] + $addValue['his']; } $array1Convert = array_values($buf); print_r($array1Convert);

ken_716
質問者

お礼

>wp_さん さっそくのお返事ありがとうございます。 >それ以前に、$array1がマスタであるのなら、連想配列のキーは連番でなく 一意のキー(この場合はprimary key? username?)にすべきでしょう。 おっしゃる通りかもしれません。 ただ、この連想配列のmathやhisで昇順降順しなければいけないので、連番の方が良いかな、と思いました。 でもよく考えれば、resort/sortが使えるのかな、と思ったり思えなかったり……。 $array1 = Array(  1=> Array(   ,'username' => 'takeo'   ,'math' => 87   ,'his' => 90  )  ,2 => Array(   ,'username' => 'youko'   ,'math' => 69   ,'his' => 56  ) ); だとデータの紐付けは簡単でしょうかね。 最悪、仮想テーブルですかね。

ken_716
質問者

補足

以下の配列だとどうでしょうか。 かなり楽というか、早くなるような気もします。 $array1 = Array( [1] => Array( [username] => takeo [math] => 87 [his] => 90 ) [2] => Array( [username] => youko [math] => 69 [his] => 56 ) ) $array2 = Array( [0] => Array( [username] => youko [math] => 75 [his] => 89 ) [1] => Array( [username] => takeo [math] => 65 [his] => 37 ) 最終的に、 $array1 = Array( [1] => Array( [username] => takeo [math] => 152 [his] => 127 ) [2] => Array( [username] => youko [math] => 144 [his] => 145 ) ) $array1 + $array2をしたいです。 データは最大で50件あります。。。。 めっちゃ行き詰っています。 どなたか。。。。

関連するQ&A