質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

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

Q&A

2回答

953閲覧

連想配列のUASORT関数に関する質問

t7y4j8orhiyjhug

総合スコア16

PHP

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

0グッド

1クリップ

投稿2018/11/09 08:11

編集2018/11/09 08:13

何かのイベントの開始日、終了日、内容メモをカテゴリごとに分けて保持した連想配列を、カテゴリ区分はそのままに、開始日が早い順にソートしたい場合、
以下のように、UASORT関数を使うのが最も簡単で見やすいと考えていますが、下記のような手法で間違いが無いか念のため確認したく、質問を投稿させて頂きました。

★データサンプル
カテゴリで分けられた配列データ群があり、その中には更に複数の配列が格納されています。最小単位のセットには、イベント開始日・イベント終了日・メモが入っています。

$source['category_01']['date_01'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_01']['date_02'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_01']['date_03'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_02']['date_04'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_02']['date_05'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_02']['date_06'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_07']['date_07'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_07']['date_08'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX'); $source['category_08']['date_09'] = array('start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX');

★開始日でソートする方法

カテゴリ区分はそのままにしたいので、「同じカテゴリの配列データ群」を一つの配列として、これに対してUASORT関数を使いました。
日付が「日時」に変わっても対応できるよう、ここでは、STRTOTIMEで比較してあります。
開始日が早い順にしたいので、比較対象AのタイムスタンプがBよりも小さい時には-1を返すようにしました。

foreach ($source as $key => $value_array){ uasort( $source[$key], function( $a, $b ){ if(strtotime($a['start_date']) === strtotime($b['start_date'])){ return 0; }else if(strtotime($a['start_date']) < strtotime($b['start_date'])){ return -1; }else{ return 1; } } ); }

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

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

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

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

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

guest

回答2

0

例示がひどすぎますね

  • 同じ配列内でstart_dateがかぶってたりとか
  • start_dateの値がみんな同じとか

検証がブレるのでよくよく考えて頂いたほうがよいでしょう

PHP

1 2$source=[ 3 'category_01'=>[ 4 'date_01'=>['start_date'=>'2018-10-19','end_date'=>'2018-10-15','value'=>'XXXX0'], 5 'date_02'=>['start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX1'], 6 'date_03'=>['start_date'=>'2018-10-02','end_date'=>'2018-10-15','value'=>'XXXX2'], 7 ], 8 'category_02'=>[ 9 'date_04'=>['start_date'=>'2018-10-09','end_date'=>'2018-10-15','value'=>'XXXX3'], 10 'date_05'=>['start_date'=>'2018-10-01','end_date'=>'2018-10-15','value'=>'XXXX4'], 11 'date_06'=>['start_date'=>'2018-10-15','end_date'=>'2018-10-15','value'=>'XXXX5'], 12 ], 13 'category_07'=>[ 14 'date_07'=>['start_date'=>'2018-10-10','end_date'=>'2018-10-15','value'=>'XXXX6'], 15 'date_08'=>['start_date'=>'2018-10-11','end_date'=>'2018-10-15','value'=>'XXXX7'], 16 ], 17 'category_08'=>[ 18 'date_09'=>['start_date'=>'2018-10-18','end_date'=>'2018-10-15','value'=>'XXXX8'], 19 ], 20 ]; 21 22foreach(array_keys($source) as $key=>$val){ 23 uasort($source[$val],function($a,$b){ 24 if(strtotime($a['start_date']) === strtotime($b['start_date'])){ 25 return 0; 26 }else if(strtotime($a['start_date']) < strtotime($b['start_date'])){ 27 return -1; 28 }else{ 29 return 1; 30 } 31 }); 32}; 33print_r($source);

投稿2018/11/09 08:31

yambejp

総合スコア114769

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

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

t7y4j8orhiyjhug

2018/11/10 03:15

ご指摘、ご教授ありがとうございます! サンプルにミス多くてすみません汗 例だと、ソースの配列のVALUEは使わないので、書いて頂いたように、array_keys を使うのがよいですね! 大変勉強になりました。 ありがとうございます。
guest

0

それで動作はすると思いますが、比較関数の部分はPHP7以降導入された宇宙船演算子(「比較演算子」参照)を使うと簡潔に書けますし、間違いが入り込みにくくなります。ほぼこの用途のために用意されてるようなものなので活用しましょう。

php

1 function( $a, $b ){ 2 return strtotime($a['start_date']) <=> strtotime($b['start_date']); 3 }

投稿2018/11/10 02:29

crhg

総合スコア1175

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

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

t7y4j8orhiyjhug

2018/11/10 03:17

こんな比較演算子があるんですね・・・ 勉強不足でした。 めちゃくちゃ便利ですねこれ!! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問