PHP 날짜를 포함하는 요소로 다차원 배열 정렬
다음과 같은 배열이 있습니다.
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');
편집 : 데이터는 배열 배열로 구성됩니다. 이들을 더 잘 구별하기 위해 내부 배열 (데이터) 레코드를 호출하여 데이터가 실제로 레코드 배열이되도록합니다.
usort
한 번에 두 개의 레코드를 주어진 비교 함수 date_compare()
에 전달합니다. date_compare
그런 다음 "datetime"
각 레코드 의 필드를 UNIX 타임 스탬프 (정수) 로 추출하고 차이를 반환하므로 결과는 0
두 날짜가 같으면 양수, 첫 번째 날짜 ( $a
)가 크면 양수, 두 번째 인수 ( $b
)가 더 큽니다. usort()
이 정보를 사용하여 배열을 정렬합니다.
php7에서 우주선 연산자를 사용할 수 있습니다 .
usort($array, function($a, $b) {
return new DateTime($a['datetime']) <=> new DateTime($b['datetime']);
});
작동합니다. strtotime을 통해 날짜를 유닉스 시간으로 변환했습니다.
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 세 번째 예제 참조 :
<?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);
?>
fyi, using a unix (seconds from 1970) or mysql timestamp (YmdHis - 20100526014500) would be be easier for the parser but i think in your case it makes no difference.
$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);
Sorting array of records/assoc_arrays by specified mysql datetime field and by order:
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));
You can simply solve this problem using usort() with callback function. No need to write any custom function.
$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]);
});
I came across to this post but I wanted to sort by time when returning the items inside my class and I got an error.
So I research the php.net website and end up doing this:
class MyClass {
public function getItems(){
usort( $this->items, array("MyClass", "sortByTime") );
return $this->items;
}
public function sortByTime($a, $b){
return $b["time"] - $a["time"];
}
}
You can find very useful examples in the PHP.net website
My array looked like this:
'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)
For 'd/m/Y'
dates:
usort($array, function ($a, $b, $i = 'datetime') {
$t1 = strtotime(str_replace('/', '-', $a[$i]));
$t2 = strtotime(str_replace('/', '-', $b[$i]));
return $t1 > $t2;
});
where $i
is the array index
'programing' 카테고리의 다른 글
SSL을 사용하는 Apache-CER를 CRT 인증서로 변환하는 방법은 무엇입니까? (0) | 2020.08.17 |
---|---|
부울 연산자의 차이점 : & 대 && 및 | (0) | 2020.08.17 |
Spring Framework에서 종속성 주입 및 제어 반전이란 무엇입니까? (0) | 2020.08.17 |
쉘에서 Erlang의 릴리스 버전 번호를 얻는 방법은 무엇입니까? (0) | 2020.08.17 |
OpenShift와 함께 기존 git repo를 사용할 수 있습니까? (0) | 2020.08.17 |