🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

2回答

3030閲覧

uasortで複数条件でのソートの方法がわからない

kuuhaku4262

総合スコア39

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2019/12/18 01:44

編集2019/12/18 02:28

前提・実現したいこと

cakephp2系を使用しています。
連想配列の中にある2つのデータを元にソートしたいです。

配列内容

[0] => Array ( [Test] => Array ( [a] => 1 [b] => 1 [c] => 1 [d] => 10 [e] => 28 [f] => 2019-12-13 16:56:28 [g] => 28 [h] => 2019-12-13 16:56:28 [i] => 9 [j] => 5 [k] => 3 [l] => 5 ) ) [1] => Array ( [Test] => Array ( [a] => 4 [b] => 1 [c] => 5 [d] => 200 [e] => 28 [f] => 2019-12-13 16:57:45 [g] => 28 [h] => 2019-12-13 16:57:45 [i] => 4 [j] => 7 [k] => 3 [l] => 1 ) ) [2] => Array ( [Test] => Array ( [a] => 3 [b] => 3 [c] => 4 [d] => 9999 [e] => 28 [f] => 2019-12-13 16:56:52 [g] => 28 [h] => 2019-12-13 17:17:43 [i] => 6 [j] => 0 [k] => 1 [l] => 4 ) )

ソート条件

[k]を昇順でソートし、同じだった場合[l]で昇順でソートしたいです。

###補足情報
自分はuasortで行いたいとお待っています。
しかし、「複数条件でも可能なのか・比較関数はどのように書くのか」がわからないため質問させていただきました。
もし、uasort以外で最適な関数がありましたらお教えいただけると嬉しいです。
ちなみに、キーはそのまま残したいためuasortを選択しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2019/12/18 02:20

サンプルデータが1個じゃソートの説明はできませんよ
kuuhaku4262

2019/12/18 02:29

ご指摘ありがとうございます。 修正いたしました。 ご回答のほどよろしくお長居いたします。
guest

回答2

0

ベストアンサー

cakephp2は分かりませんのでその要素は除外して考えます。
複数条件でも可能です。
以下は、名前(のアルファベット順)が同じだったら趣味(のアルファベット順)にソートする例です。

PHP

1<?php 2$data = [ 3 'a1' => [ 4 'name' => 'sato', 5 'age' => 24, 6 'hobby' => 'train', 7 ], 8 'a2' => [ 9 'name' => 'amemiya', 10 'age' => 28, 11 'hobby' => 'gourmet', 12 ], 13 'a3' => [ 14 'name' => 'sato', 15 'age' => 26, 16 'hobby' => 'radio', 17 ], 18 ]; 19uasort($data, 'cond'); 20var_dump($data); 21 22function cond($a, $b) { 23 if ($a['name'] === $b['name']) { 24 return $a['hobby'] > $b['hobby']; 25 } else { 26 return $a['name'] > $b['name']; 27 } 28}
  • クラス対応版
<?php class Some { function __construct() { $this->solve(); } function solve() { $data = [ 'a1' => [ 'name' => 'sato', 'age' => 24, 'hobby' => 'train', ], 'a2' => [ 'name' => 'amemiya', 'age' => 28, 'hobby' => 'gourmet', ], 'a3' => [ 'name' => 'sato', 'age' => 26, 'hobby' => 'radio', ], ]; usort($data, 'self::cond'); var_dump($data); } static function cond($a, $b) { if ($a['name'] === $b['name']) { return $a['hobby'] > $b['hobby']; } else { return $a['name'] > $b['name']; } } } $x = new Some();

無名関数にすれば煩わしくないか、と思ったりした。
(ソースはアレになりますが)

  • 無名関数版
<?php $data = [ 'a1' => [ 'name' => 'zulu', 'age' => 24, 'hobby' => 'train', ], 'a2' => [ 'name' => 'amemiya', 'age' => 28, 'hobby' => 'gourmet', ], 'a3' => [ 'name' => 'sato', 'age' => 26, 'hobby' => 'radio', ], ]; usort($data, function($a, $b) { if ($a['name'] === $b['name']) { return $a['hobby'] > $b['hobby']; } else { return $a['name'] > $b['name']; } }); var_dump($data);

投稿2019/12/18 02:27

編集2019/12/18 03:37
takepan1973

総合スコア821

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuuhaku4262

2019/12/18 02:52

uasort() expects parameter 2 to be a valid callback, function 'cond' not found or invalid function nameというエラーが出てしまいました。 condという関数はちゃんと記入しているのですが、関数が見つかりませんとなってしまいます。 どのようにすればいいのでしょうか?
takepan1973

2019/12/18 02:57

classの中に記述したんだとしたら、 $this-> なりなんなりが要るんじゃないですか?
kuuhaku4262

2019/12/18 04:33

$aと$bというのは何にあたるものなのでしょうか? もしくは、$aと$bのままで問題ないのでしょうか?
takepan1973

2019/12/18 04:36 編集

ソートというのは、ある値とある値を比較して交換していって、それを繰り返して昇順または降順に値を整列させていくものです。 その比較の値として $a と $b と表現にしているに過ぎません。 気に入らないなら別の変数名にしても良いですよ。
kuuhaku4262

2019/12/18 05:13

任意の変数だったのですね、失礼しました。 自分の場合、それぞれの['name']と['hobby']の前に一つ前の階層名である['Test']が必要でした。 追加したところ、無事解決しました。
kuuhaku4262

2019/12/18 05:15

回答と返答がとても速く、丁寧な説明であり無事問題が解決できましたのでこちらをベストアンサーとさせていただきました。 大変助かりました。 ありがとうございました。
guest

0

kとlが数値であるなら

PHP

1usort($a,function($x,$y){ 2 return $x["Test"]["k"]==$y["Test"]["k"]?$x["Test"]["l"]-$y["Test"]["l"]:$x["Test"]["k"]-$y["Test"]["k"]; 3}); 4

投稿2019/12/18 02:38

yambejp

総合スコア116688

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuuhaku4262

2019/12/18 05:16

試したところ、こちらのやり方でも解決しました。 ご回答のほどありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問