Сартаванне масіва па даце ў парадку змяншэння па даце ў PHP

У мяне ёсць масіў, і я хачу, каб адсартаваць іх па даце. Я не магу сартаваць яго правільна па даце у парадку змяншэння. Калі ласка, дапамажыце.

Array
(
[1] => Array
    (
        [1] => 11/05/2013
        [2] => Executive Planning Day
    )

[2] => Array
    (
        [1] => 13/06/2013
        [2] => Middle Leaders Planning Day
    )

[3] => Array
    (
        [1] => 12/07/2013
        [2] => New Staff Induction Day
    )

[4] => Array
    (
        [1] => 13/04/2013
        [2] => Staff Conference Day No. 1
    )

[5] => Array
    (
        [1] => 14/04/2013
        [2] => Staff Conference Day No. 2
    )

[6] => Array
    (
        [1] => 15/02/2013
        [2] => Staff Conference Day No. 3
    )

[7] => Array
    (
        [1] => 16/03/2013
        [2] => Australia Day
    )
)
6
Maby паглядзець на гэтую тэму: PHP "> stackoverflow.com/questions/96759/…
дададзена аўтар Eernie, крыніца

9 адказы

Паспрабуйце, як гэта

function sortFunction( $a, $b ) {
    return strtotime($a[1]) - strtotime($b[1]);
}
usort($data, "sortFunction");   //Here You can use asort($data,"sortFunction")

ці вы можаце паспрабаваць на дэталі, як (яго проста прапанова)

function sortFunction($a,$b)
    if ($a[1] == $b[1]) return 0;
    return strtotime($a[1]) - strtotime($b[1]);
}
usort($data,"sortFunction");

As the strtotime is not obey d/m/Y format Паспрабуйце, як гэта

$orderByDate = $my2 = array();
foreach($data as $key=>$row)
{
    $my2 = explode('/',$row[1]);
    $my_date2 = $my2[1].'/'.$my2[0].'/'.$my2[2];        
    $orderByDate[$key] = strtotime($my_date2);  
}    
array_multisort($orderByDate, SORT_DESC, $data);
20
дададзена
я паспрабаваць гэта, але не атрымлівае дадзеныя ў фармаце змяншэння. Дата замовы яшчэ не выправіць :(.
дададзена аўтар Neeraj Sharma, крыніца
атрымліваць некарэктныя дадзеныя пасля таго, як з дапамогай вашых прапаноў: Array ([0] => Array ([1] => 2013/05/11 [2] => Сярэднія лідэраў) [1] => Array ([1] => 05/10/2013 [2] => Выканаўчы дзень планавання) [3] => Array ([1] => 2013/06/25 [2] => Новы персанал Індукцыйная дзень) [4] => Array ([1] => 2013/06/27 [2] => Год 8-12 Commence) [6] => Array ([1] => 2013/06/23 [2] => Выканаўчы дзень планавання)}
дададзена аўтар Neeraj Sharma, крыніца
Я адчуваў з гэтым. Гэта працуе для мяне цяпер.; дзякуй :)
дададзена аўтар Neeraj Sharma, крыніца
Ды гэта працуе для мяне, але сартаванне дадзеных у парадку ўзрастання. Я жадаю гэта ў парадку змяншэння. як вышэй дата павінна быць у верхняй частцы масіва, то ніжэй і ніжэй.
дададзена аўтар Neeraj Sharma, крыніца
«Дата» -index не існуе
дададзена аўтар bestprogrammerintheworld, крыніца
@mkumpan - Я ведаю, што і Гаутама змяніў яго адпаведна :-) Мне падабаецца адказ.
дададзена аўтар bestprogrammerintheworld, крыніца
@ Gautam3164 - Гэта нармальна, гэта было проста ўдакладніць :-)
дададзена аўтар bestprogrammerintheworld, крыніца
Глядзіце трэці, ён, звязаны з вамі БЭК ваш час у д/м/Y формиата
дададзена аўтар Gautam3164, крыніца
Цяпер @neerajsharma праверыць гэта працуе ці няма ... разгледзець трэці анс маіх
дададзена аўтар Gautam3164, крыніца
Я атрымаў яго ..... StrToTime() будзе прымаць м/D/Y, але не D/M/Y. проста чакаць майго рэдагавання
дададзена аўтар Gautam3164, крыніца
Мне падабаецца гэты адказ. @bestprogrammerintheworld гэта таму, што ў масіве параметраў парадку дата індэксуюцца як «1», а не «даты». Адрэгуляваць адпаведным чынам.
дададзена аўтар Maxim Kumpan, крыніца

Не зусім задаволены ўсе адказы тут, так што я думаў, што я згадаю, што калі вы хочаце, каб адсартаваць <�моцны> асацыятыўны масіў з захаваннем ключоў, то вы павінны выкарыстоўваць uasort замест < код> usort . Акрамя таго, можна разабраць дату з любога фармату вы хочаце з DateTime бібліятэкі, якая таксама ўключае ў сябе некаторыя наканаваныя канстанты для некаторых з стандартных фарматаў.

uasort($array, function($a, $b){ 
    $format = 'd/m/Y'; 
    $ascending = false;
    $zone = new DateTimeZone('UTC');
    $d1 = DateTime::createFromFormat($format, $a[1], $zone)->getTimestamp();
    $d2 = DateTime::createFromFormat($format, $b[1], $zone)->getTimestamp();
    return $ascending ? ($d1 - $d2) : ($d2 - $d1);
});

<�моцны> дэма

2
дададзена

Выкарыстоўвайце usort() функцыі:

function cmp($a, $b) {
    if ($a[1] == $b[1]) return 0;
    return (strtotime($a[1]) < strtotime($b[1])) ? 1 : -1;
}

usort($data, "cmp");
2
дададзена
атрымліваць некарэктныя дадзеныя пасля таго, як з дапамогай вашых прапаноў: Array ([0] => Array ([1] => 2013/05/11 [2] => Сярэднія лідэраў) [1] => Array ([1] => 05/10/2013 [2] => Выканаўчы дзень планавання) [3] => Array ([1] => 2013/06/25 [2] => Новы персанал Індукцыйная дзень) [4] => Array ([1] => 2013/06/27 [2] => Год 8-12 Commence) [6] => Array ([1] => 2013/06/23 [2] => Выканаўчы дзень планавання)}
дададзена аўтар Neeraj Sharma, крыніца
@neerajsharma Вашы даты не ў правільны фармат . Вы можаце замяніць гэта на preg_match() . Тым не менш, гэта можа быць больш эфектыўны па часе ісці адзін раз праз $ дадзеных і дадаць пазнаку да кожнага пункта перад тым sortin, так што гэта пераўтварэнне выконваецца толькі адзін раз за адзінку.
дададзена аўтар Vedran Šego, крыніца

Выкарыстоўвайце usort (сартуе масіў па значэннях выкарыстоўваючы пэўную карыстальнікам функцыю параўнання).

usort($array, function($a1, $a2) {
   $value1 = strtotime($a1['date']);
   $value2 = strtotime($a2['date']);
   return $value1 - $value2;
});
1
дададзена
Я перакаштаваў усе прапановы, але дадзеныя не паступаюць правільна змяншальны парадак.
дададзена аўтар Neeraj Sharma, крыніца
атрымліваць некарэктныя дадзеныя пасля таго, як з дапамогай вашых прапаноў: Array ([0] => Array ([1] => 2013/05/11 [2] => Сярэднія лідэраў) [1] => Array ([1] => 05/10/2013 [2] => Выканаўчы дзень планавання) [3] => Array ([1] => 2013/06/25 [2] => Новы персанал Індукцыйная дзень) [4] => Array ([1] => 2013/06/27 [2] => Год 8-12 Commence) [6] => Array ([1] => 2013/06/23 [2] => Выканаўчы дзень планавання)}
дададзена аўтар Neeraj Sharma, крыніца

Я б стварыць масіў для замовы.

$ordered = array();
foreach ($planning as $event) {
  $ordered[$event['date']] = $event;
}
ksort($ordered);
1
дададзена
Мой масіў не мае імя індэкса даты, то, як ён будзе працаваць ??. Я не атрымліваю правільныя дадзеныя.
дададзена аўтар Neeraj Sharma, крыніца
mkumpan: таму што ўвільгатняюць некалькі соцень тысяч запісаў з улікам структура ён будзе значна больш прадукцыйнай, праўда?
дададзена аўтар Ven, крыніца
выкарыстоўваць $ падзея [1] у гэтым выпадку
дададзена аўтар Ven, крыніца
Гэта будзе спусціцца ўніз вакол вушэй, калі масіў змяшчае некалькі сотняў тысяч запісаў.
дададзена аўтар Maxim Kumpan, крыніца
Альбо калі два поля маюць тую ж дату.
дададзена аўтар Vedran Šego, крыніца

Я правёў ноч працаваць на тым, як зрабіць гэта для маёй уласнай аналагічнай праблемы. Каб адсартаваць асацыятыўны масіў па даце ключа ў гэтым масіве.

Абодва usort і uasort патрабуецца функцыя сартавання, што вы павінны напісаць і перадаць у якасці другога параметру. Функцыя сартавання выкарыстоўваецца usort і uasort параўнаць кожны элемент у масіве і захаваць вынік у выглядзе $ yourArray

 function sortFunction( $a, $b ) {
           return strtotime($a[1]) - strtotime($b[1]);
 }

 uasort($yourArray, "sortFunction");
1
дададзена

Я скокнуў тут асацыятыўны масіў сартавання і знайшоў гэтую дзіўную функцыю http://php.net /manual/en/function.sort.php . Гэта функцыя вельмі дынамічны, што сартаваць па ўзрастанні і па змяншэнні з паказаным ключом.

Простая функцыя для сартавання масіва па вызначаным ключу. Падтрымлівае асацыяцыю індэксаў.

<?php

function array_sort($array, $on, $order=SORT_ASC)
{
    $new_array = array();
    $sortable_array = array();

    if (count($array) > 0) {
        foreach ($array as $k => $v) {
            if (is_array($v)) {
                foreach ($v as $k2 => $v2) {
                    if ($k2 == $on) {
                        $sortable_array[$k] = $v2;
                    }
                }
            } else {
                $sortable_array[$k] = $v;
            }
        }

        switch ($order) {
            case SORT_ASC:
                asort($sortable_array);
            break;
            case SORT_DESC:
                arsort($sortable_array);
            break;
        }

        foreach ($sortable_array as $k => $v) {
            $new_array[$k] = $array[$k];
        }
    }

    return $new_array;
}

$people = array(
    12345 => array(
        'id' => 12345,
        'first_name' => 'Joe',
        'surname' => 'Bloggs',
        'age' => 23,
        'sex' => 'm'
    ),
    12346 => array(
        'id' => 12346,
        'first_name' => 'Adam',
        'surname' => 'Smith',
        'age' => 18,
        'sex' => 'm'
    ),
    12347 => array(
        'id' => 12347,
        'first_name' => 'Amy',
        'surname' => 'Jones',
        'age' => 21,
        'sex' => 'f'
    )
);

print_r(array_sort($people, 'age', SORT_DESC));//Sort by oldest first
print_r(array_sort($people, 'surname', SORT_ASC));//Sort by surname
1
дададзена

Рашэнне @ Gautam3164 амаль поўная. Вы павінны змяніць фармат даты. Я б сказаў:

function sortFunction( $a, $b ) {
    return strtotime(str_replace('/', '-',$a[1])) - strtotime(str_replace('/', '-',$b[1]));
}
usort($data, "sortFunction");   //Here You can use asort($data,"sortFunction")

11/10/1987 -> 10 Nov 1987 11-10-1987 -> 11 Oct 1987

0
дададзена
$sortdate = array(
    '17/08/2015',
    '02/01/2017',
    '05/02/2014'
);

function sortFunction($a, $b)
    {
    $datea = strtotime(str_replace('/', '-', $a));
    $dateb = strtotime(str_replace('/', '-', $b));
    if ($datea == $dateb)
        {
        return 0;
        }

    return ($datea < $dateb) ? -1 : 1;
    }

usort($sortdate, "sortFunction");
echo "
";
var_dump($sortdate);


0
дададзена
Невялікае тлумачэнне таго, што вы зрабілі б карысна.
дададзена аўтар empiric, крыніца