私は次のような配列を持っています:
Array
(
[0] => Array
(
[id] => 2
[type] => comment
[text] => hey
[datetime] => 2010-05-15 11:29:45
)
[1] => Array
(
[id] => 3
[type] => status
[text] => oi
[datetime] => 2010-05-26 15:59:53
)
[2] => Array
(
[id] => 4
[type] => status
[text] => yeww
[datetime] => 2010-05-26 16:04:24
)
)
誰もdatetime要素に基づいてこれをソート/順序付ける方法を提案できますか?
usort()
とカスタム比較関数を使用します。
function date_compare($a, $b)
{
$t1 = strtotime($a['datetime']);
$t2 = strtotime($b['datetime']);
return $t1 - $t2;
}
usort($array, 'date_compare');
EDIT:データは配列の配列に整理されます。これらを区別するために、内部配列(データ)レコードを呼び出して、データが実際にレコードの配列になるようにします。
usort
は、これらのレコードのうち2つを指定された比較関数date_compare()
に一度に渡します。 date_compare
は、各レコードの"datetime"
フィールドをUNIXタイムスタンプ(整数)として抽出し、差を返します。両方の日付が等しい場合、結果は0
になります。最初の引数($a
)が大きい場合は数値、2番目の引数($b
)が大きい場合は負の値。 usort()
は、この情報を使用して配列をソートします。
Php7から Spaceship operator を使用できます。
usort($array, function($a, $b) {
return new DateTime($a['datetime']) <=> new DateTime($b['datetime']);
});
これは動作するはずです。 strtotimeを使用して日付をunix時間に変換しました。
foreach ($originalArray as $key => $part) {
$sort[$key] = strtotime($part['datetime']);
}
array_multisort($sort, SORT_DESC, $originalArray);
ワンライナーバージョンでは、複数の配列メソッドを使用します。
array_multisort(array_map('strtotime',array_column($originalArray,'datetime')),
SORT_DESC,
$originalArray);
http://us2.php.net/manual/en/function.array-multisort.php 3番目の例を参照:
<?php
$data[] = array('volume' => 67, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 1);
$data[] = array('volume' => 85, 'edition' => 6);
$data[] = array('volume' => 98, 'edition' => 2);
$data[] = array('volume' => 86, 'edition' => 6);
$data[] = array('volume' => 67, 'edition' => 7);
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>
unix(1970年からの秒数)またはmysqlタイムスタンプ(YmdHis-20100526014500)を使用するfyiの方がパーサーにとって簡単ですが、あなたの場合は違いはないと思います。
$array = Array
(
[0] => Array
(
[id] => 2
[type] => comment
[text] => hey
[datetime] => 2010-05-15 11:29:45
)
[1] => Array
(
[id] => 3
[type] => status
[text] => oi
[datetime] => 2010-05-26 15:59:53
)
[2] => Array
(
[id] => 4
[type] => status
[text] => yeww
[datetime] => 2010-05-26 16:04:24
)
);
print_r($array);
$name = 'datetime';
usort($array, function ($a, $b) use(&$name){
return $a[$name] - $b[$name];});
print_r($array);
指定されたmysql日時フィールドおよび順序によるレコード/ assoc_arraysの配列のソート:
function build_sorter($key, $dir='ASC') {
return function ($a, $b) use ($key, $dir) {
$t1 = strtotime(is_array($a) ? $a[$key] : $a->$key);
$t2 = strtotime(is_array($b) ? $b[$key] : $b->$key);
if ($t1 == $t2) return 0;
return (strtoupper($dir) == 'ASC' ? ($t1 < $t2) : ($t1 > $t2)) ? -1 : 1;
};
}
// $sort - key or property name
// $dir - ASC/DESC sort order or empty
usort($arr, build_sorter($sort, $dir));
この問題は、コールバック関数で sort() を使用して簡単に解決できます。カスタム関数を記述する必要はありません。
$your_date_field_name = 'datetime';
usort($your_given_array_name, function ($a, $b) use (&$your_date_field_name) {
return strtotime($a[$your_date_field_name]) - strtotime($b[$your_date_field_name]);
});
私はこの投稿に出くわしましたが、クラス内のアイテムを返すときに時間でソートしたかったので、エラーが発生しました。
だから私はphp.netウェブサイトを調査し、これを行うことになります:
class MyClass {
public function getItems(){
usort( $this->items, array("MyClass", "sortByTime") );
return $this->items;
}
public function sortByTime($a, $b){
return $b["time"] - $a["time"];
}
}
PHP.netウェブサイト で非常に有用な例を見つけることができます
私の配列は次のようになりました。
'recent' =>
array
92 =>
array
'id' => string '92' (length=2)
'quantity' => string '1' (length=1)
'time' => string '1396514041' (length=10)
52 =>
array
'id' => string '52' (length=2)
'quantity' => string '8' (length=1)
'time' => string '1396514838' (length=10)
22 =>
array
'id' => string '22' (length=2)
'quantity' => string '1' (length=1)
'time' => string '1396514871' (length=10)
81 =>
array
'id' => string '81' (length=2)
'quantity' => string '2' (length=1)
'time' => string '1396514988' (length=10)
'd/m/Y'
日付の場合:
usort($array, function ($a, $b, $i = 'datetime') {
$t1 = strtotime(str_replace('/', '-', $a[$i]));
$t2 = strtotime(str_replace('/', '-', $b[$i]));
return $t1 > $t2;
});
ここで、$i
は配列インデックスです