Posts tagged sort

[iPhone] NSArray のソート方法

10

NSArray 内のオブジェクトの指定したメンバ変数でソートする方法です。

NSArray に複数の Book クラスが入っているとします。Book クラスは以下のようなメンバ変数を持っています。

@interface Book: NSObject {
  NSInteger no;
  NSString* furigana;
  NSDate* publish_date;
}

ソートするには NSArray 内のオブジェクトに NSComparisonResult を返すメソッドを作り、そのメソッド内で比較をします。
(続きを読む…)

WordPress 管理画面でウィジットをドラッグ&ドロップするとおかしくなるのを修正

2

WordPress の管理画面でダイナミックウィジットを編集する機能で、ウィジットをドラッグ&ドロップして順番を入れ替えることができます。しかし、ドロップする場所によっては下記画像のようになってしまいます。

管理画面のウィジット
(続きを読む…)

scriptaculous.js を使ってマトリックス状に配置した要素を並び替える

1

scriptaculous.js を使って並び替えを行う を応用して格子状に並んだ要素を並び替える例です。基本的な部分はリスト形式の並び替えと同じですので省略します。
最初にデモ、その後にコードを紹介します。

デモ


#sortarea { width: 350px; } #sortarea div { float: left; width: 100px; height: 70px; border: 1px solid #000; margin: 5px; text-align: center; padding-top: 30px; cursor: default; }

A1
A2
A3
A4
A5
A6
A7
A8
A9

ソートする要素

前回は li タグで要素を定義しましたが、今回は div タグで定義しました。
CSS で格子状に並ぶようにしています。

<style>
#sortarea {
width: 350px;
}

#sortarea div {
float: left;
width: 100px;
height: 70px;
border: 1px solid #000;
margin: 5px;
text-align: center;
padding-top: 30px;
cursor: default;
}
</style>

<div id="sortarea">
<div id="drag_1">A1</div>
<div id="drag_2">A2</div>
<div id="drag_3">A3</div>
<div id="drag_4">A4</div>
<div id="drag_5">A5</div>
<div id="drag_6">A6</div>
<div id="drag_7">A7</div>
<div id="drag_8">A8</div>
<div id="drag_9">A9</div>
</div>

ソートする JavaScript コード

Sortable.create の option に overlap:’horizontal’ を指定しなくても並び替えはできますが、少しぎこちない感じになりますので、指定しておいたほうがいいでしょう。

<script type="text/javascript" language="javascript">
// <![CDATA[
Sortable.create("sortarea",{
    tag:'div',overlap:'horizontal',constraint: false,
});
// ]]>
</script>

scriptaculous.js を使って並び替えを行う

2

JavaScript の読み込み

まず prototype.js と scriptaculous.js を読み込む

<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="scriptaculous.js"></script>

ソートするリストを作成する

ここでのポイントはドラッグさせたい要素に drag_1 のように「共通の名前+アンダバー+数字」を付けることです。

<ul id="sortarea">
<li id="drag_1">A1</li>
<li id="drag_2">A2</li>
<li id="drag_3">A3</li>
<li id="drag_4">A4</li>
<li id="drag_5">A5</li>
<li id="drag_6">A6</li>
<li id="drag_7">A7</li>
<li id="drag_8">A8</li>
<li id="drag_9">A9</li>
</ul>

ソートする JavaScript コード

ソートするエリアとソートする要素を定義した後で実際にソートするための JavaScript コードを書く。このコードがソートさせたい要素よりも前に書くとエラーになるので注意。

<script type="text/javascript" language="javascript">
// <![CDATA[
Sortable.create("sortarea",{
    onUpdate:function(){
        new Ajax.Updater(
        'sortarea',
        '/path/to/phpcode',
            {
                asynchronous:true,
                evalScripts:true,
                parameters:Sortable.serialize("sortarea")
            }
        );
    }
});
// ]]>
</script>

onUpdate でソート結果をPHP に送りデータベースなりに反映させる。
データベースに反映などが必要なければ、onUpdate は不要です。

デモ

これを実際に使用した例が下記になります。

#sortarea { width: 350px; border: 1px solid #000; } #sortarea li { cursor: default; }

  • LIST1
  • LIST2
  • LIST3
  • LIST4
  • LIST5
  • LIST6
  • LIST7
  • LIST8
  • LIST9

CakePHP Pagination まとめ

2

CakePHP の Pagination に関してまとめてみました。

コントローラでコンポーネント、ヘルパーに Pagination を指定

// 使用コンポーネント名
var $components = array('Pagination');
// 使用ヘルパー名
var $helpers = array('Pagination');

コントローラの一覧表示するアクションでの一覧表示取得方法

$this->Pagination->modelClass = 'Model'; // 使用するモデル
$this->Pagination->sortBy = 'created';	 // デフォルトのソートするフィールド名
$this->Pagination->direction = 'DESC';	 // デフォルトの昇順、降順を指定
$this->Pagination->show = 10;			 // 1ページに表示する件数
$conditions = array(); 					 // 検索条件
list($order,$limit,$page) = $this->Pagination->init($conditions);
$lists = $this->Model->findAll($conditions, $fields, $order, $limit, $page, $recursive);

ビューでのヘルパー使用準備

ビューで Pagination ヘルパーを使用できるようにする
< ?php $pagination->setPaging($paging); ?>

ビューでの総件数と表示している件数の表示

< ?php echo $pagination->result('検索結果:', '/', '?'); ?>件
上記のように指定すると「検索結果:1?10/5253件」と表示されます。

ソートするフィールドを変更するリンクを表示する

< ?php echo $pagination->sortBy('field_name', 'フィールド名', 'ModelName'); ?>
field_name にソートするフィールド名、
フィールド名にリンクに表示する名前、
ModelName にはフィールド名が属するモデル名
を指定します。
モデル名は $this->Pagination->modelClass と同じ場合には省略可能です。

また、sortBy メソッドは
veiws/heplers/pagination.php
function sortBy ($value, $title=NULL, $Model=NULL,$escapeTitle=true,$upText=' ^',$downText=' v')
のように定義されています。見て分かるとおり第5、6引数を指定することにより、ソートしたときのリンクのフィールド名につく「^」「v」の文字を変更することができます。

select タグによってソートを指定したいときは sortBySelect メソッドがあります。
function sortBySelect($sortFields, $t='Sort By: ',$upText=' ^',$downText=' v')

PHP で多次元配列のソートを SQL の ORDER BY のように複数項目でソートする

1

PHP で多次元配列の項目を複数使用して SQL の ORDER BY のようにソートする方法です。

$answer =
  array(
    "category1" =>
       array(
         "ans1" => 1,
         "ans2" => 1,
         "ans3" => 1
       ),
    "category2" =>
       array(
         "ans1" => 1,
         "ans2" => 2,
         "ans3" => 0
       ),
    "category3" =>
       array(
         "ans1" => 0,
         "ans2" => 2,
         "ans3" => 1,
       ),
  );

というような配列を下記条件でソートします。

  • ans1 の多い順
  • ans1 が同じ場合は ans2 の多い順
  • ans2 が同じ場合は ans3 の多い順

PHP の uasort 関数を使用します。
この関数はユーザーが比較関数を定義でき、その関数を使用して連想インデックスを保持したまま配列をソートします。

uasort($answer, "compare");

function compare($a, $b) {
    foreach ($a as $k=>$v) {
        if ($a[$k] > $b[$k]) {
            return -1;
        } else if ($a[$k] < $b[$k]) {
            return 1;
        }
    }
}

上記の関数を使用してソートした結果 $answer は下記のようになりました。

$answer =
  array(
    "category2" =>
       array(
         "ans1" => 1,
         "ans2" => 2,
         "ans3" => 0
       ),
    "category1" =>
       array(
         "ans1" => 1,
         "ans2" => 1,
         "ans3" => 1
       ),
    "category3" =>
       array(
         "ans1" => 0,
         "ans2" => 2,
         "ans3" => 1,
       ),
  );

MySQL で NULL を一番最後にして昇順にソートする

4

2008.2.27 追記
コメントで教えていただきました下記方法で簡単にできました。
is null asc の指定と 通常の asc の指定をするのがポイントですね。

SELECT
  id,
  comment
FROM table
ORDER BY comment IS NULL ASC, comment ASC;

—–追記ここまで—–

MySQL で昇順にソートすると NULL は一番最初に来ます。
それを最後にできないかということで下記のようなSQL を考えてみました。

SELECT
  id,
  comment,
  CASE WHEN comment IS NULL
    THEN 10000
    ELSE ASCII(LEFT(comment,1))
  END AS dummy
FROM table
ORDER BY dummy ASC, COMMENT ASC

comment カラムを昇順でソートして、NULL の場合は一番最後に NULL がきます。
あまりスマートな方法ではないのですが、これで取り合えず NULL を最後にして昇順でソートするということができました。

ORACLE とかだと下記のように簡単にできますね。
ORDER BY comment ASC NULL LAST

NULLS FIRST
NULL 値を順序の最初にするソートを行なう
NULLS LAST
NULL 値を順序の最後にするソートを行なう

Go to Top