- ベストアンサー
連想配列を複数条件で比較して別配列に抽出したい
- idとnameとcountとその他のいろいろな要素を持つ連想配列entryがあります。
- データベースの操作で同じidのcountのみを更新したいため、このentryから、「nameが同じで、countが最大のものを抽出した3次元の連想配列entry2」を作成したいです。
- このような働きをするphpのコードを教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (3)
- osamuy
- ベストアンサー率42% (1231/2878)
> array_push($r.array_combine ドットでなくカンマですね。 詳しくは、array_pushのリファレンスをご覧ください。
お礼
ドットではなくカンマでしたか。大変申し訳ありません。 その部分を訂正しましたが、やはり Parse error: syntax error, unexpected $end in C:\xampplite\htdocs\test.php on line 19 と出てきました。 知らない関数を調べつつ、,と.、:と;などの打ち間違いが原因かと思いフォントを大きくしてコードを調べてみましたが、構文エラーの原因はやはりわかりませんでした。 実行環境は ###### Apache Friends XAMPP Lite (Basis Package) version 1.7.3 ###### + Apache 2.2.14 (IPV6 enabled) + MySQL 5.1.41 (Community Server) with PBXT engine 1.0.09-rc + PHP 5.3.1 (PEAR) + Miniperl 5.10.1 + XAMPP Control Version 2.5.8 (ApacheFriends Edition) + XAMPP CLI Bundle 1.6 + XAMPP Port Check 1.5 + XAMPP Security 1.1 + SQLite 2.8.17 + SQLite 3.6.20 + OpenSSL 0.9.8l + phpMyAdmin 3.2.4 + msmtp 1.4.19 (a sendmail compatible SMTP client) + Webalizer 2.21-02 (with GeoIP lite) + Ming 0.4.3 for PHP + PDF with pdflib lite v7.0.4p4 for PHP で、訂正したPHPは ---- <?php $id=array(1,2,3,4,5,6,7); $name=array('satou','satou','sio','sio','sio','sio','miso'); $count=array(35,49,18,29,39,40,28); $entry=array('id' =>$id,'name' =>$name,'count' =>$count); $result=array(); foreach(array2recordset( $entry ) as $value){ $vname = $value[ 'name' ]; if ( isset ($result[$vname])) if($result[$vname]['count'] >=$value['count']) continue; $result [$vname] =$value; } foreach ($result as $e ){ ?><?= implode(' ',$e) ?> <? } function array2recordset( $param_array ){ $karr = array_keys($param_array); $varr = array_values($param_array); $r=array(); while( count( $varr[0] ) > 0 ) array_push($r,array_combine($karr, array_map('array_shift',&$varr ) ) ); return $r; } ?> になります。 他に原因があれば、どのようなものでしょうか。 どうかよろしくお願いします。
- osamuy
- ベストアンサー率42% (1231/2878)
こんなんとか。 『「nameが同じで、countが最大のものを抽出した3次元の連想配列entry2」を作成したいです』については、未対応。適宜、変形すればよいかなということで。
お礼
再度のご回答、本当にありがとうございます。 まずは教えていただいたコードを使用してみようと忠実に打って実行したところ、 Parse error: syntax error, unexpected $end in C:\xampplite\htdocs\test.php on line 19 と19行目でエラーが出ます。 コードの打ち間違いかと思い、何度も見直したのですが結局わかりませんでした。 原因が知りたいです。どうかよろしくお願いします。 --- <?php $id=array(1,2,3,4,5,6,7); $name=array('satou','satou','sio','sio','sio','sio','miso'); $count=array(35,49,18,29,39,40,28); $entry=array('id' =>$id,'name' =>$name,'count' =>$count); $result=array(); foreach(array2recordset( $entry ) as $value){ $vname = $value[ 'name' ]; if ( isset ($result[$vname])) if($result[$vname]['count'] >=$value['count']) continue; $result [$vname] =$value; } foreach ($result as $e ){ ?><?= implode(' ',$e) ?> <? } function array2recordset( $param_array ){ $karr = array_keys($param_array); $varr = array_values($param_array); $r=array(); while( count( $varr[0] ) > 0 ) array_push($r.array_combine($karr, array_map('array_shift',&$varr ) ) ); return $r; } ?>
- osamuy
- ベストアンサー率42% (1231/2878)
こんなのとか。なんのひねりもないですが。
お礼
ご回答ありがとうございます。大変参考になりました。 しかし、自分でも作ってみたのですが、シンタックスエラーになってしまいます。 真ん中のforeach文が原因かな、などと自分でも原因を考えて見たのですが、結局どういう風にいじってみても原因がわかりません。 どのようにしたら修正できるのか、よろしければご教示ください。 どうかよろしくお願いします。 <?php $id=array(1,2,3,4,5,6,7); $name=array("satou","satou","sio","sio","sio","sio","miso"); $count=array(35,49,18,29,39,40,28); $entry=array("id" =>$id,"name" =>$name,"count" =>$count); $result=array();//entry2…わかりにくいので結果の格納はresultにします。 foreach($entry as $value){ if ( isset ( $result[$value["name"]] ) ){ if( $result[ $value["name"] ]["count"] >=$value["count"] ){ $result[ $value["name"] ] =$value ; } } foreach($result as $entry){ echo implode(" ",$entry)."\n"; } ?>
お礼
またもやご回答、本当にありがとうございます。 うーん…どう考えても私の環境が壊れていますよね…… もう一度、環境そのものを再構築してみます。 何度もご解答していただき、本当に助かりました。 心より感謝の言葉を申し上げます。ありがとうございました。