• 締切済み

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

例えば、以下のような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

  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • 多次元配列の計算方法について

    PHP習い始めたばかりで困っているので教えてください。。 多次元配列の要素ごとの計算ループが分からないです。 前提:多次元配列$tajiには15個の要素があり、それぞれに0か1が大量に入っています(具体的には、チェックボックスの回答に因っていて、回答される度に0か1がDBを経由して増えていく感じです) $taji[$rone][] = $row[$rone]; //var_dumpで確認したところちゃんと多次元配列として各要素に値が入っていました。 foreach($taji as $val1){ foreach($val1 as $val2){ print array_sum($val2); }; } …だとエラーになってしまいます。。 希望としては、要素ごとに合計を計算して表示してほしいのですが、 array_sumは多次元配列を無視してしまうのでしょうか?? 全く分からず困っているので、どなたかご教授よろしくおねがいします。

    • ベストアンサー
    • PHP
  • PHPの基礎的なことなんですが・・・

    初心者です。とある参考書をみてdo whileを習っています。 以下のスクリプトがなぜ、条件文にあてはまるのか知りたいわけです。 $db_data[0] = array("username" => "abcdefg0"); $db_data[1] = array("username" => "abcdefg1"); $db_data[2] = array("username" => "abcdefg2"); //ここまでは多次元配列しているな~って感じくらいでわかります。 do{ $flg = FALSE;     //$flgには、なにもいれない。 $username = md5(uniqid(rand(),1));     //ランダムにIDを作っているんだな~って感じです if($db_data[0]["username"] == $username){ $flg = true;} if($db_data[1]["username"] == $username){ $flg = true;} if($db_data[2]["username"] == $username){ $flg = true;}     //問題はここなんですが、なぜ比較演算子「==」で$flg = trueに なるのかがわかりません。なぜ多次元配列で作られた"username"とmd5で 作られた$usernameが一致するのでしょうか? } while ( $flg ); print "あなたのユーザIDは" . $username . "です。";

    • ベストアンサー
    • PHP
  • PHPの多次元配列について

    HTMLでホームページを作れる以外はプログラムに関しほぼ素人です。 環境 XAMPP1.70(最新)にてアパッチなど一括ダウンロード PHP言語にて3×4の表で以下の数値を多次元配列にて作成しようと思っているのですが、当方初心者なもので、 以下のコード(細かい部分は省略しています)、特にforeachがネストになっている部分の処理の流れがいまいちよくわかりません ~~~~~~~~~~~~~~~~~~~~~~~~~ <table border=2> <th>都市名</th> <th>最高気温</th> <th>最低気温</th> <?php  $data=array( array("東京"32,25) array("名古屋",45,67) array("埼玉",32,67) array("大阪",86,34) ) foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"    ●1回目foreachからここまでの流れがいまいち分かりません } print "</tr>"; ?> ~~~~~~~~~~~~~~~~~~~~ 一つ目のforeachにて、配列$dataが指定されていますので外側の配列を処理していくと思うのですが、具体的にどういう順番で処理されていくのでしょうか。 またforeach()の中の"$cityが最終的に$valueに格納という形になっていますが、10~13行目のarray("東京",32,25)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列型の宣言?

    こんにちは。 あるサイトで見たphpのサンプルなのですが、 postされた全ての値を配列に格納するもので、以下のような記述がありました。 foreach((array)$_POST as $key => $value){  $array[$key] = $value; } ポストされた全ての値を、配列$arrayに連想配列として格納しているのはわかるのですが、 foreachの、(array)というのはどういう働きをするものなのでしょうか。 これは、$_POSTが配列であるという宣言でしょうか。 それと、postされた値がない場合、$_POSTを配列だと宣言しておくことで、foreachのエラーを回避するような役割もあるのでしょうか。 恥ずかしながら、(array)のような記述をphpではあまり見ないような気がするのですが、なんというキーワード(?)で勉強すれば理解が深められるかもご教授頂けますと助かります。 宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 添字配列をマージする方法はありますか?

    <? $a[0]["test"] = Array("Q1","Q2"); $b[0]["test_result"] = Array("A","B"); print_r(Array_Merge($a,$b)); ?> 期待する結果 Array ( [0] => Array ( [test] => Array ( [0] => Q1 [1] => Q2 ) [test_result] => Array ( [0] => A [1] => B ) ) ) 期待する結果にならないので、foreachでぶん回して、 再度格納しています・・ 添字配列をマージできる関数な方法はないでしょうか?

    • 締切済み
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • 連想配列のキー値(連番)を基に、別の配列を作るには?

    下記のように、キー値の一部に連番を持った連想配列 があるのですが、このキー値と連番で別の配列を 簡単に作る方法は無いでしょうか? もとの配列 $ary = array("item0"=>"x","item1"=>"y","item2"=>"z","data0"=>"o","data1"=>"p","data2"=>"q"); 上の$aryから $item=array([0]=>"x",[1]=>"y",[2]=>"z"); $data=array([0]=>"o",[1]=>"p",[2]=>"q"); のような形の配列を得たいのです。 foreach($ary as $key => $val){ } の構文で、$key値を調べて分断し、新しい配列に pushしていくしかないでしょうか? ※PHP4.3です

    • ベストアンサー
    • PHP
  • 配列をテキストデータから読み込む方法

    質問です。 現在テキストデータ(data.txt)に 100 95 80 90 10 といった形で保存しています。 以下のように設定すると objFso = new ActiveXObject("Scripting.FileSystemObject"); myFile = objFso.GetFile("c:\\data.txt"); objTxt = myFile.OpenAsTextStream(1); var DATA = new Array(); do{ DATA = new Array(objTxt.ReadLine()); }while(!objTxt.AtEndOfLine) とした場合、DATAには最後の値しか入っていないのですが どこが間違っているのでしょうか? これはDATAがきちんと配列になっていないということでしょうか?

  • 不要な配列を消したい

    2次元配列で、不要な要素を取り除きたいのですが良い方法が思い浮かばず、どうしたものかと悩んでいます。 一番初めと5番目を消したいのですが、preg_match で日付の2006にマッチしない要素をunsetしてみましたがうまくいきませんでした。 $data = array ( array('<br>'), array("2006 03 22", test), array("2006 03 23", test2), array("2006 03 25", test3), array('') ); $pattern = '/2006/'; foreach($data as $key => $value) { if(preg_match($pattern, $value[$key])) { unset($data[$key]); } } もし方法をご存知のかたおられましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
このQ&Aのポイント
  • mfc-l8650cdwの紙詰まりを解消するための方法を教えてください。
  • mfc-l8650cdwで起きる紙詰まりの原因や対処法について詳しく教えてください。
  • mfc-l8650cdwの紙詰まりトラブルを解決するためのヒントをお教えください。
回答を見る