人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL PHPの質問です。

kyori[]
name[]
という2つの配列があります。データは入っている状態です。
kyori[]の小さい順にソートしてTOP3を抜き出し、それに対応するname[]を表示させたいです。

つまり
kyori[2]
kyori[20]
kyori[5]
の順にソートされた場合、
name[2]
name[20]
name[5]
を表示させたいのです。

このようなPHPスクリプトを教えてください。
MySQLへの接続スクリプトは省略して頂いて結構です。

よろしくお願い致します。

●質問者: tokyosmash
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL name PHP スクリプト ソート
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● amagami
●19ポイント

こんな感じでしょうか(divタグは全角で括っています)


$kyori= Array(100, 1, 2, 5, 15);

$name= Array('No.100', 'No.1', 'No.2', 'No.5', 'No.15');

asort($kyori, SORT_NUMERIC);

$cnt= 0;

foreach ($kyori as $i => $value) {

echo "<div>{$name[$i]}</div>\n";

if ($cnt++ == 2) break;

}

?>


2 ● tobeoscontinue
●41ポイント ベストアンサー

http://jp2.php.net/manual/ja/function.asort.php

asortを使えば連想キーと要素との関係を維持しつつ配列をソートするそうで。

$kyori = array(50, 50,1,60,70,3,10,10,10,10,10,10,11,11,11,11,11,11,11,11,4);
asort($kyori);
list($key, $value) = each($kyori);
echo $key.">>".$value."\n";
list($key, $value) = each($kyori);
echo $key.">>".$value."\n";
list($key, $value) = each($kyori);
echo $key.">>".$value."\n";

後は$name[$key]のようにすれば取り出せます。

$top = array_slice(array_keys($kyori),0,3);
foreach ($top as $key)
 echo $key."\n";

array_keys()でキーだけを取り出し、array_slice()で更にTOP3を取り出したほうがスマートかも。PHP5.0.2以降であればarray_slice()でpreserve_keysをTRUEにする事でキーを温存できるようでarray_keys()しなくても希望の値は取り出せると思います。

◎質問者からの返答

具体的で助かります!

ありがとうございました。


3 ● Mook
●20ポイント

PHP の次の関数が使えると思います。

mysql_fetch_assoc

array_multisort


サンプルを組み合わせただけですが、こんな感じになるでしょうか。

SQL 部分は実際のものに修正してみてください。

 $sql = "SELECT kyori, name FROM sometable WHERE somecondition = 1";
 $result = mysql_query($sql);

// データ行が存在する間、それを $data に連想配列形式でセットする
 while ($row = mysql_fetch_assoc($result)) {
 $data[] = array( 'kyori'=> $row["kyori"], 'name'=> $row["name"] );
 }

// 列方向の配列を得る
 foreach ($data as $key => $row) {
 $kyori[$key] = $row['kyori'];
 $name[$key] = $row['name'];
 }

// データを kyori の昇順、name の降順にソートする
 array_multisort($kyori, SORT_ASC, $name, SORT_DESC, $data);

// 結果の表示
 print " NAME KYORI<br>\n";
 for( $i=1 ; $i<=3 ; $i++ ) {
 print "$i {$kyori[$i-1]} {$name[$i-1]}<br>\n";
 }
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ