プロが教える店舗&オフィスのセキュリティ対策術

idとnameとcountとその他のいろいろな要素を持つ連想配列entryがあります。

entry
id name count …
-------------
1 satou 35
2 satou 49
3 sio   18
4 sio   29
5 sio   39
6 sio   40
7 miso  28
:
--------------
データベースの操作で同じidのcountのみを更新したいため、このentryから、「nameが同じで、countが最大のものを抽出した3次元の連想配列entry2」を作成したいです。

entry2
id name count 
-------------
2 satou 49
6 sio   40
7 miso  28
:
--------------


このような働きをするphpのコードを教えてください。

よろしくお願いします。

A 回答 (4件)

    • good
    • 0
この回答へのお礼

またもやご回答、本当にありがとうございます。
うーん…どう考えても私の環境が壊れていますよね……

もう一度、環境そのものを再構築してみます。
何度もご解答していただき、本当に助かりました。
心より感謝の言葉を申し上げます。ありがとうございました。

お礼日時:2012/01/02 23:19

> array_push($r.array_combine



ドットでなくカンマですね。
詳しくは、array_pushのリファレンスをご覧ください。
    • good
    • 0
この回答へのお礼

ドットではなくカンマでしたか。大変申し訳ありません。

その部分を訂正しましたが、やはり
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; } ?>

になります。
他に原因があれば、どのようなものでしょうか。

どうかよろしくお願いします。

お礼日時:2012/01/02 12:15

こんなんとか。


『「nameが同じで、countが最大のものを抽出した3次元の連想配列entry2」を作成したいです』については、未対応。適宜、変形すればよいかなということで。
「連想配列を複数条件で比較して別配列に抽出」の回答画像2
    • good
    • 0
この回答へのお礼

再度のご回答、本当にありがとうございます。
まずは教えていただいたコードを使用してみようと忠実に打って実行したところ、
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; } ?>

お礼日時:2012/01/01 20:25

こんなのとか。

なんのひねりもないですが。
「連想配列を複数条件で比較して別配列に抽出」の回答画像1
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。大変参考になりました。
しかし、自分でも作ってみたのですが、シンタックスエラーになってしまいます。
真ん中の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";
}

?>

お礼日時:2011/12/31 05:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!