![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
PHP: 5.2.1
MySQL: 5.0.27
PHPとMySQLのバージョンは上記の通りです。
Smartyも利用しております。
(1) テキストエリアに以下のような情報を入力します。
┏━━━━━━━━━━━┓
┃ 5
┃ 3
┃ 1
┃ 2
┃ 4
┗━━━━━━━━━━━┛
(2) 上記の情報をもとにデータベースに情報を取りに行きます。
(3) その結果、以下の情報が取得できます。
ID┃NAME ┃PRICE
━╋━━━╋━━━
1 ┃メロン┃1000
2 ┃りんご┃100
3 ┃ぶどう┃300
4 ┃バナナ┃150
5 ┃みかん┃100
(4) このデータを、(1)でテキストエリアに入力した順番に並べ替えて表示する。
┏━━━━━━━━━━┓
┃5 みかん 100
┃3 ぶどう 300
┃1 メロン 1000
┃2 りんご 100
┃4 バナナ 150
┗━━━━━━━━━━┛
という処理を行いたいのですが、(4)の部分が出来ません。
始めは1件1件問い合わせをかけて、1件ずつ表示すればと思ったのですが、
テキストエリアに入力する情報が1000件を超える場合があります。
速度に不安があるので、まとめて問い合わせする方法でやりたいのですが、
そうなると、どうしてもPHP側でソートさせる必要があります。
しかし、ソートさせるための基準となるものが
「テキストエリア内の情報の順番」なのです。
array_multisort関数なども試してみたのですが、
うまくいきませんでした。
データベースの書き換えを行わず、且つ、
1件ずつ問い合わせする方法もしない。といった場合、
上記を再現する事は可能でしょうか?
お知恵をお貸し頂ければ幸いです。
No.4
- 回答日時:
以下のようなロジックで出来るのではと思います。
ただし、(3)のデータベースから取得した情報のIDが、(4)のテキストエリアで指定されたIDの中に無かった場合どうするか、という問題があります。
【前提1】
(3)の結果を仮に $recs という配列に格納したとします。
$recs[0] --- array('id'=>1, 'name'=>'メロン', 'price'=>1000);
$recs[1] --- array('id'=>2, 'name'=>'りんご', 'price'=>100);
【前提2】
(4)の結果を $sdats という配列に格納したとします。
$sdats = array(5, 3, 1, 2, 4,...)
【ロジック】
// 表示順の配列 $skeys を作ります
$skeys = array();
$cnt = 0;
foreach ($sdats as $id)
{
$skeys[$id] = $cnt;
$cnt ++;
}
// データをソートします。
usort($recs, "cmp_recs");
// ソート用関数
function cmp_recs($a, $b)
{
global $skeys; // $skeys をグローバル変数で渡します
$dnum = 99999; // $skeys に ID がない場合のダミー順番号
$aid = $a['id'];
$bid = $b['id'];
$anum = isset($skeys[$aid]) ? $skeys[$aid] : $dnum;
$bnum = isset($skeys[$bid]) ? $skeys[$bid] : $dnum;
return $anum < $bnum ? -1 : 1;
}
ご回答頂きましてありがとうございます。
usort関数を利用する方法ですね!
色々調べて、まずその方法にたどり着いたのですが、
今回の作業が、未解析のクライアントのシステムで、且つ、複雑怪奇な構造でしたので、
いくら試してもエラー。エラー。エラー…。
私の勉強不足が一番の原因なのですが、(汗
今回は納期が迫っていましたので、とりあえずANo.1の方の方法で実装したいと思います。
また今回のような状況になったら、
教えて頂いたロジックを参考に組んでみようと思います。
非常に勉強になりました。
ありがとうございました。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_14.png?5a7ff87)
No.3
- 回答日時:
FORM入力から1000行ものデータを送り込むこと自体、設計に無理がありませんか?SQL文がものすごいことになりますよね。
まさかその1000行をキーボード入力しているとは思えませんが、まとめてファイルのアップロードではだめなんですか?
普通はそうしますし、そのほうがバグの追っかけも楽です。
ご回答頂きましてありがとうございます。
おっしゃる通りで、SQL文がものすごいことになっております。(汗
CSVファイルのアップロードも考えたのですが、
利用者側の事を考えるとフォームにせざるを得なかった次第です。
メンテナンスの事も考慮して、次回はファイルアップロード形式も検討したいと思います。
ありがとうございました。
No.2
- 回答日時:
1000件にもなる可能性があるのなら、テンポラリテーブルにセッションID(もしくは適当なテンポラリ文字列),行No,入力した値を落としておいて、結合しないとselectのSQL文が大変なことになりませんか?
そうしておけば、テンポラリの行No順で取り出せます。取り出し終わったらテンポラリからセッションIDが一致するレコードを削除すればよろしいかと(定期的にテンポラリはtruncateした方がいいかもしれませんが・・)。
ご回答頂きましてありがとうございます。
知識不足でその発想に至りませんでした。(汗
なるほど!そういう手もあるのですね!
今回の作業が、未解析のシステムでの作業でしたので、
データベース操作はSELECTだけがいいだろうと判断しておりました。
その為、PHP側でのソートにばかり気がいってしまい、
MySQLを利用してのソートの発想がありませんでした。
勉強になります!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Excelで数式をそのままコピーしたい どうすればいいですか? 4 2022/09/16 02:16
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- Access(アクセス) Access IF文でテーブルに存在しない場合の処理について 2 2022/10/10 18:09
- MySQL 【投稿情報用データベース posts】は必要ないと思います。 1 2022/06/02 21:25
- PHP PHP MySql ページング 2 2022/09/20 06:38
- JavaScript Javascriptを使ってQRコード読み取り、取得した情報をPOSTしたいと思っています。 1 2023/04/28 15:18
- 地図・道路 関西エリアの高速道路について教えてください 1 2022/04/05 13:13
- Excel(エクセル) 条件付き書式 別のシートで色付けされたセルデータの転記漏れを防ぐ書式を入れたい 4 2022/04/22 06:36
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
php で1から100までの素数の表...
-
C言語 最大値と最小値を求めて...
-
STLのvectorで作った配列をメン...
-
functionの中にfunction?
-
mallocで char *型の配列を確...
-
MYSQLとPHPによって取得する多...
-
PHPのセレクトボックスの初期値...
-
C言語の2次元配列における行・...
-
C言語の配列をPush(追加)する...
-
配列の比較
-
多次元連想配列 検索 削除 ...
-
配列の要素をキーにする
-
templateを使ったXOR swapのバ...
-
プログラミングのPythonのnoteb...
-
フォームのデータを受け取りに...
-
配列について
-
共通項を持つ配列同士を結合さ...
-
配列 一部除外してソート?
-
arrayをどうやって表示するのか?
-
連想配列で値が空だったら、要...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
スカラーのベクトル微分
-
特定の文からメールアドレスの...
-
CArrayの要素としてCStringArra...
-
C言語 最大値と最小値を求めて...
-
行列
-
読み(あ行~わ行)ごとに分け...
-
配列の要素(value)に、変数を...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
php で1から100までの素数の表...
-
【PHP】配列のキー名の修正は可...
-
Perlで重複行を削除したい
-
fgetc関数について
-
CArrayのソート
-
ファイルの書き込みについて教...
-
配列の添え字が小数だとどうなる?
-
PHPのmin関数、「1」以上の数値...
-
forとかで連番の変数を一気に格...
-
delphi 2次元配列がわかりません
おすすめ情報