PHP 날짜를 포함하는 요소로 다차원 배열 정렬


113

다음과 같은 배열이 있습니다.

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 요소를 기반으로 정렬 / 순서하는 방법을 제안 할 수 있습니까?

답변:


206

사용 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()이 정보를 사용하여 배열을 정렬합니다.


1
이 예에서 $ array는 $ a 및 $ b 요소를 포함해야합니까? -im 오류가 발생했습니다. 잘못된 비교 기능
Tim

아니, $a하고 $b내 배열을 개최한다 $array. 함수 이름을 잘못 입력하지 않았는지 확인하십시오.
Ferdinand Beyer

이해가 안 돼요. 내 예에서는 배열에 3 개의 배열이 있습니다. 이름을 확인했지만 여전히 유효하지 않은 비교 기능이 있습니다
Tim

내가 추가 한 설명을 참조하십시오. 코드를 테스트했는데 잘 작동합니다!
Ferdinand Beyer

9
CodeIgniter를 모르지만 클래스 내부에서 함수를 정의하고 있습니까? 클래스 외부에서 정의하거나 다른 콜백 인수를 사용해야하는 것보다 : usort($array, array($this, "date_compare")), 따라서 usort()클래스 함수 / 메소드 임을 알 수 있습니다. 참조 : php.net/manual/en/…
Ferdinand Beyer

45

작동합니다. 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);

이것은 훌륭하게 작동합니다. $ originalArray를 다차원 배열의 이름으로 바꾸십시오. 그리고 'datetime'을 date의 하위 배열 필드 이름으로 바꿉니다. 감사.
washere

1
이 솔루션은 저에게 잘되고 있습니다. 정렬 옵션도 좋습니다 (SORT_ASC 또는 SORT_DESC). 감사합니다.
Andras Barth

하나의 작은 경고와 함께 아름답게 작동합니다 (또는 내가 잘못하고 있습니다). 정렬 해야하는 날짜 필드에는 dd / mm / yyyy 또는 yyyy / mm / dd (슬래시 포함) 형식의 날짜가 있습니다. 이 경우 정렬이 어떤 이유로 작동하지 않았습니다 (전체 날짜가 아닌 날짜로만 정렬 됨). 날짜를 dd-mm-yyyy 또는 yyyy-mm-dd로 변환하기 위해 날짜를 사전 처리했는데 정말 감사합니다 !!! (이 하이픈와 함께 작동하지만 이유에 대한 아이디어는 슬래시?)
하비에르 Larroulet

array_multisort는 내 json 파일을 pubdate별로 정렬하는 데 사용 된 유일한 정렬 방법입니다. 감사.
grc

나를 위해 정말 잘 작동합니다. 감사합니다
Fernando Torres


6

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);

?>

참고로, 유닉스 (1970 년의 초) 또는 mysql 타임 스탬프 (YmdHis-20100526014500)를 사용하는 것이 파서에게는 더 쉬울 것이지만 귀하의 경우에는 아무런 차이가 없다고 생각합니다.


5

지정된 mysql datetime 필드 및 순서에 따라 레코드 / assoc_array 배열 정렬 :

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));

완전히 내가 필요한 것. 그러나 변경해야합니다 str_to_upper으로 strtoupper.
Jimmy Adaro 2016

4

$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);

4

콜백 함수와 함께 usort () 를 사용하여이 문제를 간단히 해결할 수 있습니다 . 사용자 지정 함수를 작성할 필요가 없습니다.

$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]);
});

1

이 게시물을 보았지만 수업 내 항목을 반환 할 때 시간별로 정렬하고 싶었는데 오류가 발생했습니다.

그래서 저는 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)

1

들어 '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배열 색인은 어디에 있습니까


1

여전히 sortByDate 함수가있는 클래스 내에서 해결 된 문제를 찾고있는 사람들은 아래 코드를 참조하십시오.

<?php

class ContactsController 
{
    public function __construct()
    {
    //
    }


    function sortByDate($key)
    {
        return function ($a, $b) use ($key) {
            $t1 = strtotime($a[$key]);
            $t2 = strtotime($b[$key]);
            return $t2-$t1;
        };

    }

    public function index()
    {

        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-11 12:38:23','created_at' =>'2020-06-11 12:38:23');
        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-16 12:38:23','created_at' =>'2020-06-10 12:38:23');
        $data[] = array('contact' => '434343434', 'name' => 'dickson','updated_at' =>'2020-06-7 12:38:23','created_at' =>'2020-06-9 12:38:23');


        usort($data, $this->sortByDate('updated_at'));

        //usort($data, $this->sortByDate('created_at'));
        echo $data;

    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.