• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数の項目によってソートしたい)

PHP5.2.4を使用して複数の項目によってソートしたい方法

このQ&Aのポイント
  • PHP5.2.4を使用して、複数の項目によってソートする方法を説明します。
  • ユーザー定義比較関数を利用して、value1が同じ場合value2を基準にソートする方法を紹介します。
  • value1の比較とvalue2の比較を組み合わせることで、複数の項目によるソートを実現できます。

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

  • ベストアンサー
noname#227352
noname#227352
回答No.1

記述が大幅に変わりますが、array_multisort()は? 恐らく、もっとシンプルに出来る事だと思われます。

参考URL:
http://zapanet.info/phpdoc/function.array-multisort.html
takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、オブジェクトでも列方向の配列に分解する例を真似てできました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 関数で定義した配列のソート

    お世話になります。 配列のソートは xx = new Array(3, 7, 8, 1); xx.sort(); document.write('xx='+xx+'<br>'); function hikaku(a, b) { return(b - a); } yy = new Array(3, 7, 8, 1); yy.sort(hikaku); document.write('yy='+yy+'<br>'); で、できました。 ここで、 function aitem(name,value,date){ this.name=name; this.value=value; this.date=date; } var goods=new Array( new aitem('b',500,'06/05/01'), new aitem('a',200,'06/07/01'), new aitem('d',800,'06/06/01'), new aitem('c',300,'05/09/01'), ); と、配列goodsを定義します。 そして、例えばvalueで並び替えた配列を取得するなんてことはできないでしょうか。 よろしくお願いします。

  • ある項目(数値)に加算したものでソートしたい。

    ある項目(数値)に加算したものでソートしたい。 下のようなテーブルがあります。 そのpointに加算した結果でソートしたいのですが、可能でしょうか? テーブル name  | point ああAAA| 100 ああBBB| 400 いいCCC| 300 ううDDD | 200 おおCCC| 500 ============== ふつうにORDER BY point DESC でソートすると下記のようになります。 おおCCC| 500 ああBBB| 400 いいCCC| 300 ううDDD | 200 ああAAA| 100 ============== そこでpointに加算した結果(dbには反映させず、あくまで表示上のみ) name[ *CCC]にはpointに80%加算 いいCCC 300→540 おおCCC 500→900 ソート結果 おおCCC| 900 いいCCC| 540 ああBBB| 400 ううDDD | 200 ああAAA| 100 ============== このような事は可能でしょうか?

  • クロージャ

    javascriptのクロージャについて。 クロージャにnewは必要ですか? コンストラクタであれば、newでオブジェクトを生成しますが、クロージャはどうでしょうか? クロージャ-------------------- function Person(n, a){ var name = n; var age = a; return { getName: function() { return name; }, setAge: function(i){ if( 0<= i ){ age = i; } }, getAge: function(){ return age; } } } var p = new Person('Hanako', 3); // new を付けなくても生成できる

  • 線形リストのソートについて

    データ構造を線形リストとして、情報を管理するプログラムのソートについてです。 以下のプログラムはデータを入れ替えて、その後アドレスを入れ替えるようにしてソートを行っていますが、そうではなく線形リストなのでつなぎ替えるようにしてソートを行うプログラムを作成したいのですがわからないのでご教授をお願い致します。ソートは逐次決定で行ってます。 構造体の宣言として、nameとageとnextは氏名と年齢と次のポインタを指します。NAME_SORT、AGE_SORTはマクロです。 struct sortlist(struct PERSON *head) { int menu; struct PERSON person; /* 情報 */ struct PERSON move_person; /* 比較していく情報 */ struct PERSON work; /* 情報の一時的保存 */ struct PERSON temp; /* 作業用 */ struct PERSON temp_address; /* アドレス作業用 */ printf("ソート機能を選択:"); printf("%d:氏名\n",NAME_SORT); printf("%d:年齢\n",AGE_SORT); /* 交換処理 */ for(person = head; person -> next != NULL; person -> person -> next) { work = person; /* 交換データの探索 */ for(move_person = person -> next; move_person != NULL; move_person -> next) { switch(menu) { case NAME_SORT: if(strcmp(work -> name, move_person -> name) > 0) { work = move_person; } break; case NAME_SORT: if(work -> age > move_person -> age) { work = move_person; } break; default: printf("機能以外が選択されました"); return head; } if(work != person) { /* 情報の交換 */ temp = *person; *person = *work; *work = temp; /* アドレスの交換 */; temp_address = employee -> next; person -> next = work -> next; work -> next = temp_address; } } } } printf(“ソート完了”); }

  • 単方向リストの昇順ソートについて

    単方向リストに値を入れるところまでは何とか切り抜けることができましたが、次はソートにてこずっています。this.value と this.next.valueの値を比べて入れ替えるというところまでは何とか想像つきますが、どうやってソートが完了するまでまわしてあげればいいかが分かりません。 class Chain3{ public static void main(String args[]){ Node start = new Node(Integer.parseInt(args[0])); for(int i = 1; i < args.length; i++){ start.append(Integer.parseInt(args[i])); } start.sort(); } } class Node{ private int value; private Node next; public Node(int value, Node next){ this.value = value; this.next = next; } public Node(int value){ this.value = value; } public Node(){ this.value = 0; this.next = null; } public int getValue(){ return value; } public void setValue(int value){ this.value = value; } public Node getNext(){ return next; } public void setNext(Node n){ this.next = n; } public void append(int v){ if(this.next == null) this.next = new Node(v); else this.next.append(v); } //昇順にソートする public void sort(){ int tmp; /*ここで私はバブルソートで行おうと思っているのだが、どう回数制限していいか分からない*/ if(this.value > this.next.value){ tmp = this.value; this.value = this.next.value; this.next.value = tmp; } this.next.sort(); } }

    • ベストアンサー
    • Java
  • 複数のラジオボタン項目でのテキスト入力欄の有効化

    調べながら手探りでソースを書いてみましたが、うまく動きません。 javascript初心者ですので、ものすごく初歩的な勘違いがあったり、または根本から全く間違っているかもしれません。 以下のソースのように、ラジオボタンで選択してもらう項目が3つある場合、それぞれ「なし」を選択した場合だけテキスト入力欄を非表示にしたいのですがうまく動きません。 ラジオボタンで選択する項目が1つずつだとうまくいくのですが、3つの場合どこを修正したらいいのでしょうか? よろしくお願いします。 【HTML】 <script type="text/javascript" src="sample.js" charset="UTF-8"></script> <ul> <li><input type="radio" name="AAA" id="nothing" value="なし" onClick="changeDisplay()"/>なし</li> <li><input type="radio" name="AAA" id="by_week" value="1週間ごと" onClick="changeDisplay()"/>1週間ごと</li> <li><input type="radio" name="AAA" id="by_month" value="1ヶ月ごと" onClick="changeDisplay()"/> 1ヶ月ごと</li> <li><input type="radio" name="AAA" id="by_year" value="1年ごと" onClick="changeDisplay()"/>1年ごと</li> </ul> <p id="AAA-text" style="display:none;"> <input type="text" name="XXX" size="15" > </p> <ul> <li><input type="radio" name="BBB" id="nothing" value="なし" onClick="changeDisplay()"/>なし</li> <li><input type="radio" name="BBB" id="by_week" value="1週間ごと" onClick="changeDisplay()"/>1週間ごと</li> <li><input type="radio" name="BBB" id="by_month" value="1ヶ月ごと" onClick="changeDisplay()"/> 1ヶ月ごと</li> <li><input type="radio" name="BBB" id="by_year" value="1年ごと" onClick="changeDisplay()"/>1年ごと</li> </ul> <p id="BBB-text" style="display:none;"> <input type="text" name="YYY" size="15" > </p> <ul> <li><input type="radio" name="CCC" id="nothing" value="なし" onClick="changeDisplay()"/>なし</li> <li><input type="radio" name="CCC" id="by_week" value="1週間ごと" onClick="changeDisplay()"/>1週間ごと</li> <li><input type="radio" name="CCC" id="by_month" value="1ヶ月ごと" onClick="changeDisplay()"/> 1ヶ月ごと</li> <li><input type="radio" name="CCC" id="by_year" value="1年ごと" onClick="changeDisplay()"/>1年ごと</li> </ul> <p id="CCC-text" style="display:none;"> <input type="text" name="ZZZ" size="15" > </p> 【sample.js】 function changeDisplay() { if ( document.mailform["AAA"][0].checked ) { document . mailform["XXX"] . disabled = true; document . getElementById('AAA-text') . style . display = "none"; } else { document . mailform["XXX"] . disabled = false; document . getElementById('AAA-text') . style . display = "inline"; } } window.onload = changeDisplay; //---------------------------------------------------------------------------- function changeDisplay() { if ( document.mailform["BBB"][0].checked ) { document . mailform["YYY"] . disabled = true; document . getElementById('BBB-text') . style . display = "none"; } else { document . mailform["YYY"] . disabled = false; document . getElementById('BBB-text') . style . display = "inline"; } } window.onload = changeDisplay; //---------------------------------------------------------------------------- function changeDisplay() { if ( document.mailform["CCC"][0].checked ) { document . mailform["ZZZ"] . disabled = true; document . getElementById('CCC-text') . style . display = "none"; } else { document . mailform["ZZZ"] . disabled = false; document . getElementById('CCC-text') . style . display = "inline"; } } window.onload = changeDisplay;

  • Javascriptリアルタイムエラーチェック

    Javascript初心者です。 本を見ながらフォームの入力値のリアルタイムエラーチェックを実装しています。 テキストフィールドへの入力値の妥当性検証はできるのですが、 チェックボックスが一つもチェックされていなかった場合にチェックボックスを囲むfieldsetを赤くさせるのがうまくいきません。 電話番号の形式指定ならば String.prototype.isZip = function(){ return this.isEmpty()||/^\d{3}-\d{4}$/.test(this); } という形です。thisはname属性を参照します。 すべての項目にエラーがない場合に確認画面へ進めるようにしています。 String.prototype.isNotEmpty = function() { return this != ''; } String.prototype.isEmpty = function(){ return this == ''; } String.prototype.isShorterThan = function(n){ return this.length<=n; } String.prototype.isLongerThan = function(n){ return this.length >= n; } String.prototype.isZip = function(){ return this.isEmpty()||/^\d{3}-\d{4}$/.test(this); } String.prototype.isPhone = function() { return this.isEmpty()||/^\d{2,4}-\d{1,4}-\d{4}$/. test(this); } String.prototype.isEmail = function() { return this.isEmpty()||/^([\w-]+\.?)+@[\w-]+(\.([\w-]+))+$/.test(this); } var formValidation = function(name, feedback, fields){ var form = document.forms[name]; for (var i=0; i<form.elements.length; i++){ (function(){ var elm = form.elements[i]; var f = fields[elm.name]; if (f){ f.element = elm; f.process = function(){ var ok = true; if (f.convert) f.element.value = f.convert(f.element.value); if (f.validation) ok = f.validation(f.element.value); if (f.feedback) f.feedback(ok, f.element); return ok; } elm.onblur = function(e){ f.process() } } })(); } form.onsubmit = function(){ var all_ok = true; for (key in fields) if (fields[key] && !fields[key].process()) all_ok = false; return feedback(all_ok); }; } </script> <script type="text/javascript"> <!-- <![CDATA[ window.onload = function(){ var fields = { 'last_name':{ convert: function(val){ return val.cnvKana('asKV').trim() }, validation: function(val){ return val.isNotEmpty() && val.isShorterThan(16) }, feedback: function(ok, elm){elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272'; } }, 'furigana':{ convert: function(val){ return val.cnvKana('sKVC').trim() }, validation: function(val){ return val.isNotEmpty() && val.isComposedOf(cs.kata.zen+cs.space.han) && val.isShorterThan(32) }, feedback: function(ok, elm){ elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272'; } }, 'phone':{ convert: function(val){ return val.cnvPhone() }, validation: function(val){ return val.isNotEmpty() && val.isPhone() }, feedback: function(ok, elm){elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272';} } 'email':{ convert: function(val){ return val.trim() }, validation: function(val){ return val.isNotEmpty() && val.isEmail() }, feedback: function(ok, elm){ elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272';}, }, }; var feedback = function(ok){ if (ok) alert("確認画面へ進みます。"); else alert("フォームの内容に不備があるようです。再度の確認をお願いいたします。") return ok; }; new formValidation('MAINFORM', feedback, fields); } // ]]> --> <form name="MAINFORM" action="check.php" method="post"> <input name="last_name" type="text"> <input name="furigana" type="text" /> ~~~~~~ <fieldset id="checkboxDemo" name="job"> <legend><img src="images/label_kozanaiyou.gif" width="92" height="18"></legend> <label for="checkbox-1" tabindex="1">オフィス(Word,Excel)</label> <input type="checkbox" name="kouza[]" id="checkbox-1" value="オフィス(Word,Excel)" /> <label for="checkbox-2" tabindex="2">ネットワーク構築</label> <input type="checkbox" name="kouza[]" id="checkbox-2" value="ネットワーク構築" /> <label for="checkbox-3" tabindex="3">WEBデザイン</label><input type="checkbox" name="kouza[]" id="checkbox-3" value="WEBデザイン" /> <label for="checkbox-4" tabindex="4">WEBプログラミング</label> <input type="checkbox" name="kouza[]" id="checkbox-4" value="WEBプログラミング" />  </fieldset> 自分で色々と試してみましたがうまくいかず、皆様のお力を借りたいと思い投稿しました。 詳しい方教えてください。

  • 同一クラス内 関数内でユーザ定義関数でソート

    class class_name { function sort_function($val1,$val2) { 並び替え関数 return 0or1or-1;} function sousa() { $array=("山田","田中","砂糖"); uasort($array,$this->sort_function) } } 上のようなことをやろうとしているのですけれど function sousa()を実行すると ---エラー---- Warning: uasort() [function.uasort]: Invalid comparison function. in XXXX.php on line XX ------------- がでます。 クラス内関数を【並び替え用ユーザ定義関数】 として用いるにはどうしたらいいのでしょうか? 解決策をご存知の方がおられましたらご教授頂きたいです。 もちろん、関数をクラス内に配置しないか、 sousa関数内に並び替え関数を配置すれば正常に動作しますが 上のような配置で実行したいです。 よろしくお願いします。m(TT)m

    • ベストアンサー
    • PHP
  • Array.sortメソッドのデフォルト比較関数

    JavaScriptのArray.sortメソッドは、 引数を指定しなければデフォルトの比較関数でソートされますが、 この比較関数を取り出して利用できないでしょうか。 要件は、プロパティ[name]と[value]を持ったオブジェクトの配列のソートです。 nameプロパティは半角英数字の文字列で、これをキーにソートしたいと考えています。 ソートの基準は、Array.sortのデフォルトと同じです。 つまり、こんなコードを想定しています。 var ary = [o1, o2, o3]; // o1~o3はそれぞれ上記のオブジェクト ary.sort(function(a, b){ return compare(a.name, b.name); }); このコードにおけるcompare関数を、Array.sortのデフォルト比較関数にしたいのですが、 これは自前で作成するしかないのでしょうか。 数値だけでなく文字列全般の比較になるので、結構実装が面倒そうなのですが、 自作する場合に何か使えそうな標準関数等、無いでしょうか。 今のところ思いついているのは、下記みたいなものです。 var compare = function(a, b) {  var temp = [a, b];  temp = temp.sort();  return temp[0] === a ? -1 : 1; } 比較関数内で更にArray.sortを呼んで2項目をソートし、 順番が入れ替わったかどうかを判定するだけです。 何だか冗長で気持ち悪いコードですので、代案を探しています。

  • thisとvar ?

    javascript初心者です。 コンストラクタ(プロトタイプ)とクロージャを学んでいますが、 コンストラクタ(プロトタイプ)では、関数内にthisで変数宣言、クロージャはvarで宣言しています。 この違いの理由は何でしょうか?漠然とした質問ですみません。 thisとvarでの変数宣言の違いなど教えていただけないでしょうか? コンストラクタ-------------------- function Person(n){ this.name = n; } Person.prototype.city = 'Tokyo'; Person.prototype.moveTo = function(c){ document.write(this.name + ': Moving to... ' + c + '<br>'); Person.prototype.city = c; } クロージャ------------------- function Person(n, a){ var name = n; var age = a; return { getName: function() { return name; }, setAge: function(i){ if( 0<= i ){ age = i; } }, getAge: function(){ return age; } } }