array_multisortがうまくできません

このQ&Aのポイント
  • ある調味料に対応するスコアを設定して、最もスコアが高い調味料を3つ選別しようと思います。
  • PHPのarray_multisort関数を使用して、調味料のスコアを降順に並べ替えます。
  • しかし、コードがうまく動作しないため、訂正箇所を教えていただけないでしょうか。
回答を見る
  • ベストアンサー

array_multisortがうまくできません

ある調味料に対応するスコアを設定して、 最もスコアが高い調味料を3つ選別しようと思います。 <?php $name=array("satou","sio" ,"miso","sansyo","wasabi"); $score=array(12,18,13,24,19); $res=array('name'=>$name,'score'=>$score); $output=array_multisort($res['score'],SORT_DESC);// print($output[name][0]); print($output[name][1]); print($output[name][2]); ?> 考えたのですが、なぜうまくいかないのかが分かりません。 どなたか訂正箇所を教えてください。よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

まずはマニュアルをちゃんと読んでください。 http://php.net/manual/ja/function.array-multisort.php array_multisortの戻り値はbool値(ソート処理の成否)なので、$outputに代入しても意味がありません。 書くとしたら if (array_multisort($res['score'], $res['name'])) { print($res['name'][0]) . "<br />"; print($res['name'][1]) . "<br />"; print($res['name'][2]) . "<br />"; } などとすることになります。

spinia0120
質問者

お礼

ありがとうございます。 他のサイトでなんとなく調べて、今まではマニュアルを読む習慣がありませんでした。 これからはしっかりと読み込もうと思います。 本当にありがとうございました。

関連するQ&A

  • array_multisortについて

    階層が深いのですが以下のような多次元配列があります。PHP5です。 $data['data'][0]['name'] = 'あああ'; $data['data'][0]['price0'] = '80'; $data['data'][1]['name'] = 'いいい'; $data['data'][1]['price0'] = '350'; $data['data'][2]['name'] = 'ううう'; $data['data'][2]['price0'] = '514'; これをprice0の値でソートしたく調べたところarray_multisortが使えそうで 以下のようにしてみましたがエラーになってしまいます。 array_multisort($price0, SORT_DESC, $data['data']); マニュアルを見たのですがよくわからずでどうすればうまくソートできるでしょうか?

    • 締切済み
    • PHP
  • 連想配列を複数条件で比較して別配列に抽出したい

    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のコードを教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 順位を付ける時のスコアの重複について

    質問致します。例えばボーリングのスコアを順位をつけて並べたいのですが、参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=561384)を元に以下の様に書いてみました。 ---------------------------------------- <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); print("第1位:".$Count[0]." ".$Name[0]."<br>"); for($i=1;$i<count($Name);$i++){ if($Count[$i] != $Count[$i-1]){ print("第".($i+1)."位:".$Count[$i]." "); } print($Name[$i]."<br>"); } ?> ------------------------------------------------ しかしながら以上を実行してみますと順位の表示のされ方がうまくいきません。うまくいかない箇所はスコア(123)が3人並んだ場合に以下のようにしたいのですが、ならなくて苦闘しております。どのように書換えればよろしいのでしょうか。アドバイス頂ければと存じます。よろしくお願い致します。 第1位 202 Fさん 第2位 198 Bさん  第3位 123 Aさn 第3位 123 Cさn 第3位 123 Eさん 第6位 117 Dさん 

    • ベストアンサー
    • PHP
  • 連想配列を array_multisort() でphp4、php5の違い

    いつもお世話になります。 連想配列をarray_multisort()でソートしようとしています。 php5のサーバでは思うように動作するのですが、 php4のサーバでは、ソートされません。 print_r($ary); Array ( [BuID] => 11 [BuName] => aaaa [yymmdd] => 080507 [DateDisp] => 08年05月07日(水) [DateType] => 1210086000 [TaikaiName] => AAAA [HRef] => [AnkName] => ) Array ( [BuID] => 12 [BuName] => bbbb [yymmdd] => 080822 [DateDisp] => 08年08月22日(金) [DateType] => 1219330800 [TaikaiName] => BBBBBBBB [HRef] => [AnkName] => ) ・・・・・・・・・・・・・・・・・ ・・・・・・・・・・・・・・・・・ の様な連想配列をyymmddでソートしようとしています。 php5.2.6だと、 foreach($ary as $key => $row){ $yymmdd[$key] = $row['yymmdd']; } array_multisort($yymmdd,SORT_DESC,$ary); で、$aryにyymmddで並び替えられた配列が入ります。 しかし、php4.2.2では、ソートされず、もとの配列がそのまま$aryに入ってしまいます。 array_multisort()は、phpのバージョンによって動作が異なるような記載もありません。 どなたかわかる方見えましたらよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 順位のところを画像にする方法

    前回私がしました(http://oshiete1.goo.ne.jp/qa2429369.html)の質問に通ずるのですが、新たに質問させて頂きます。 例えばボーリングのスコアを順位をつけて並べたいのですが、 -------------------------------------- <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); $rank=-1; for($i=0;$i<count($Name);$i++){ if($Count[$rank] != $Count[$i]) $rank = $i; print("第".($rank + 1)."位:".$Count[$i]." ".$Name[$i]."\n"); } ?> 以上の順位の所を「○位」と書かれた画像にしたいのですが、以下のやり方でOKでしょうか?とりあえず表示されたのですが、もっと合理的な良い方法があるかと思いまして。 ---------------------------------------- 「第1位」と書かれた画像→0.gif 「第2位」と書かれた画像→1.gif 「第3位」と書かれた画像→2.gif ・      ・      ・ という風に上の画像を用意しておきます。そこで <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"); $Count=array(123,198,123,117,123,202); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); $rank=-1; for($i=0;$i<count($Name);$i++){ if($Count[$rank] != $Count[$i]) $rank = $i; print("<img src='".$rank.".gif'>:".$Count[$i]." ".$Name[$i]."\n"); } ?> ------------------------------------------------------------ どなたか吟味の程よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 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
  • flush()関数でページを徐々に表示する方法

    質問致します。PHPスクリプトを処理する際、全て処理し終わった後、いっきにページに表示されるのが普通だと思うのですが、これを段階的に表示したいのですが、それには出力バッファをオフにする。つまりflush()関数を使えばOKと聞きました。以下の例でいえば、どの場所にこのflush()関数を入れれば良いのでしょうか? <?php $Name=array("Aさん","Bさん","Cさん","Dさん","Eさん","Fさん"・・・この後1000件続く); $Count=array(123,198,123,117,123,202・・・この後1000件続く); array_multisort($Count,SORT_DESC,SORT_NUMERIC,$Name,SORT_DESC,SORT_STRING); print("第1位:".$Count[0]." ".$Name[0]."<br>"); for($i=1;$i<count($Name);$i++){ if($Count[$i] != $Count[$i-1]){ print("第".($i+1)."位:".$Count[$i]." "); } print($Name[$i]."<br>"); } ?> 以上のように1000件もの順位を表す為、徐々に表示したいというのが私のやりたい事です。 参考ページ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1248483)等を見たのですが、初心者な者で太刀打ちできないでおります。 具体的にflush()関数をここに入れるという風にご指摘頂ければ幸いでございます。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • mysqlのスマートな書き方

    MySQL5.1とPHP5を使っています。 phpからmysqlのtestテーブルにアクセスして点数順に生徒名一覧を作成したいと思っています。 イメージとしてはこのような感じです。○○○は名前になります。 90点以上 ○○○ ○○○ 80点以上 ○○○ ○○○ ○○○ 70点以上 ○○○ ○○○ ○○○ ○○○ このような一覧を表示するため、下記のように作成したところ上記のような表示をしてくれました。 しかしながら、同じmysql_queryを何度も使っていますし、DBに負担が掛かりそうな気がします(本当に負荷があるのかは分かりませんが・・・) もっとスマートな書き方はないものでしょうか。 よろしくお願い致します。 echo "90点以上"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if ($res['tensu'] >= 90){ echo $res['name']; echo "<br>" ; } } echo "80点以上~90点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 80 and $res['tensu'] < 90 ){ echo $res['name']; echo "<br>" ; } } echo "70点以上~80点未満"; $rs = mysql_query("select * from test where kamoku = '1' order by tensu desc LIMIT 0, 100;",$conn); while($res = mysql_fetch_array($rs, MYSQL_ASSOC)){ if($res['tensu'] >= 70 and $res['tensu'] < 80 ){ echo $res['name']; echo "<br>" ; } }

    • ベストアンサー
    • MySQL
  • phpでmysqlを検索、計算

    PHPでmysql内のデータを、条件で絞込み、 一致するものの平均と個数を画面で表示したいのですが、 エラーが表示され、検索結果を表示することができません 現在書いているコードは以下になります ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー <html> <head> <title>検索結果</title> </head> <body> <?php ~~省略~~ $Name = $_POST['namae']; $Day = $_POST['hiduke']; $conn = mysql_connect($url,$user,$pass); $sdb = mysql_select_db($db,$conn); $sql1 = select avg(score) from seiseki where name = "$Name" and day like "$Day*"; $sql2 = select count(score) from seiseki where name = "$Name" and day like "$Day*"; $sql3 = select count(score) from seiseki where name = "$Name" and day like "$Day*" and score = 1; $res1 = mysql_query($sql1); $res2 = mysql_query($sql2); $res3 = mysql_query($sql3);  print "<table border=1 cellpadding=0 cellspacing=0>\n";  print "<tr>\n";  print "<td>合計</td>";  print "<td align=right>{$sql2}回</td>;"  print "</tr>\n";    print "<tr>"; print "<td>1</td>";  print "<td align=right>{$sql3}回</td>;"  print "</tr>\n";    print "<tr>\n";  print "<td>平均</td>";  print "<td align=right>{$sql1}</td>";  print "</tr>\n";  print "</table>\n"; mysql_free_result($res,&res2,&res3); mysql_close($conn); ?> </body> </html> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー seisekiテーブルにはnameとdayとscoreがあり、 nameはyamadatarouのようにローマ字で dayは20110110のように数字で scoreには1~4の数字が入っています nameは完全一致、dayは前方一致で sql1では数字の平均、sql2では合計回数、sql3では1の回数をカウントしています 30行目「$sql1 = select avg(score) ~ ~ ~」のあたりに記述エラーがあると表示されるので、 おそらく検索方法の文法が間違っているのですが、 色々調べてみても記述の仕方がこの方法以外見つかりません 何か記述方法の間違いや別の記述方法がありましたら、ご教授お願いいたします また、現在エラーは表示されていませんが、 print近辺も見ようみ真似での記述ですので、間違いなどがありましたら ご教授いただけないでしょうか

    • ベストアンサー
    • PHP
  • PHP mysql の戻り値

    PHP内にて、下記の処理、上手くINSERTはされているのですが、 デバッグで埋めた print のところで res1 == Object id #6 が表示されます。 (1) Object id #6とはなんでしょうか? (2)正常、異常のときの $stmt の戻り値は何が返りますか?   (3)正常、異常のときの $res  の戻り値は何が返りますか? ~~~(一部抜粋)~~~ $sql = "insert into thread ( id, name, insert_datetime ) values (?, ? , now())"; $stmt = self::$_conn->prepare($sql); $res = $stmt->execute(array($id_mx,$this->get('name'))); print "res1 == ".$res."</br>"; die_if_dberror($res); ~~~~~~~~~~~

    • ベストアンサー
    • PHP

専門家に質問してみよう