Как отсортировать массив объектов по одному из его элементов [PHP]


в настоящее время я обнаружил, что я не могу отсортировать массив объектов, используя в качестве индекса сортировать один из его ключей.

Давайте предположим, что массив приходит так:

Array
(
    [0] => stdClass Object
        (
            [Id] => e6930148-319f-4b87-bb57-8aae98adfc55
            [State] => FINISHED
            [StartDate] => 2018-05-03T08:57:30+02:00
            [EndDate] => 2018-05-03T08:59:17+02:00
        )
    [1] => stdClass Object
        (
            [Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2018-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

и мне нужно, чтобы все результаты были отсортированы по VALR StartDate и по убыванию, чтобы всегда иметь самую последнюю в качестве первой записи.

я попытался создать функцию сравнения

  function comp($a, $b) {
    if ($a < $b) return true;
    else return false;
  }

Создание нового массива с данные, которые я получаю

  foreach ($json as $datos) {
    $id = $datos->Id;
    $estado = $datos->State;
    $fechaIni = $datos->StartDate;
    $fechaFin = $datos->EndDate;
    $proceso = $datos->Configuration->ProcessId;

    array_push($arrayDatos, $datos)
  }

и вызывая его затем из uksort

  uksort($arrayDAtos, comp(xxxx,yyyy))

но именно здесь я думаю, что я связался, потому что я не знаю, как передать функции comp значения, необходимые для сортировки по StartDate.

Давай, я не знаю ничего ясного ни о работе uksort, ни о том, что именно должна делать функция comp

 2
Author: Vera Canet, 2018-05-04

2 answers

Вы можете использовать в действительности usort, если вы не возражаете против изменения (числовых) индексов нового массива, в противном случае вы можете использовать uasort. Обе функции поддерживают функцию в качестве параметра, где мы указываем, как мы хотим порядок. В этом случае мы будем использовать нашу функцию object_sorter.

Я предлагаю эту функцию, несколько продвинутую и, безусловно, улучшаемую, которая предлагает следующие преимущества:

  • Вы можете повторно использовать его для Сортировать по любому ключевые объекта, который будет проводится в параметр
  • Поддерживает параметр порядка дополнительно (DESC), если вы хотите заказать форму DESCendente.
  • Использовании strnatcmp, пользуясь его преимуществами, чтобы сделать сравнение.

Функция просто так:

function object_sorter($clave,$orden=null) {
    return function ($a, $b) use ($clave,$orden) {
          $result=  ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) :  strnatcmp($a->$clave, $b->$clave);
          return $result;
    };
}

И чтобы использовать его, вы просто передаете ему массив.

  • Чтобы вы сортировали его по ключу ASC StarDate:

    usort($objDatos, object_sorter('StartDate'));
    
  • Чтобы вы сортировали его по ключу DESCStarDate:

    usort($objDatos, object_sorter('StartDate','DESC'));
    

Полный Тест:

СМ. ДЕМО В REXTESTER

<?php
/*PHP: Ordenar array de objetos por uno de sus miembreos con usort - https://es.stackoverflow.com/q/161586/29967*/ 
/*Función*/
function object_sorter($clave,$orden=null) {
    return function ($a, $b) use ($clave,$orden) {
          $result=  ($orden=="DESC") ? strnatcmp($b->$clave, $a->$clave) :  strnatcmp($a->$clave, $b->$clave);
          return $result;
    };
}

/*Objeto original*/

    $objDatos = 
        array(
                0 => (object) array(
                                    'Id' => 'e6930148-319f-4b87-bb57-8aae98adfc55',
                                    'State' => 'FINISHED',
                                    'StartDate' => '2019-05-03T08:57:30+02:00',
                                    'EndDate' => '2018-05-03T08:59:17+02:00'      
                                   ),
                1 => (object) array(
                                    'Id' => '4263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
                                    'State' => 'FINISHED',
                                    'StartDate' => '2018-05-03T10:15:39+02:00',
                                    'EndDate' => '2018-05-03T10:15:58+02:00'      
                                   ),
                3 => (object) array(
                                    'Id' => '5263f6a9-6e49-4aee-bcf6-70e1d2578fc5',
                                    'State' => 'FINISHED',
                                    'StartDate' => '2020-05-03T10:15:39+02:00',
                                    'EndDate' => '2018-05-03T10:15:58+02:00'      
                                   ),            
            );

/*Original*/
echo "OBJETO ORIGINAL:".PHP_EOL.PHP_EOL;
print_r($objDatos);


/*Orden por defecto (ASCendente)*/
usort($objDatos, object_sorter('StartDate'));
echo PHP_EOL.PHP_EOL."ORDEN ASCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);


/*Orden DESCendente (indicándolo en parámetro)*/
usort($objDatos, object_sorter('StartDate','DESC'));
echo PHP_EOL.PHP_EOL."ORDEN DESCENDENTE:".PHP_EOL.PHP_EOL;
print_r($objDatos);


?>

Результат:

ИСХОДНЫЙ ОБЪЕКТ:

Array
(
    [0] => stdClass Object
        (
            [Id] => e6930148-319f-4b87-bb57-8aae98adfc55
            [State] => FINISHED
            [StartDate] => 2019-05-03T08:57:30+02:00
            [EndDate] => 2018-05-03T08:59:17+02:00
        )

    [1] => stdClass Object
        (
            [Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2018-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

    [3] => stdClass Object
        (
            [Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2020-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

)

ПОРЯДОК ВОЗРАСТАНИЯ:

Array
(
    [0] => stdClass Object
        (
            [Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2018-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

    [1] => stdClass Object
        (
            [Id] => e6930148-319f-4b87-bb57-8aae98adfc55
            [State] => FINISHED
            [StartDate] => 2019-05-03T08:57:30+02:00
            [EndDate] => 2018-05-03T08:59:17+02:00
        )

    [2] => stdClass Object
        (
            [Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2020-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

)

ПОРЯДОК УБЫВАНИЯ:

Array
(
    [0] => stdClass Object
        (
            [Id] => 5263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2020-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

    [1] => stdClass Object
        (
            [Id] => e6930148-319f-4b87-bb57-8aae98adfc55
            [State] => FINISHED
            [StartDate] => 2019-05-03T08:57:30+02:00
            [EndDate] => 2018-05-03T08:59:17+02:00
        )

    [2] => stdClass Object
        (
            [Id] => 4263f6a9-6e49-4aee-bcf6-70e1d2578fc5
            [State] => FINISHED
            [StartDate] => 2018-05-03T10:15:39+02:00
            [EndDate] => 2018-05-03T10:15:58+02:00
        )

)

Я надеюсь, что это полезно для вас.

Примечание: функция которые мы можем адаптировать, улучшить и включить в нашу утилитарную библиотеку кода.

 3
Author: A. Cedano, 2018-05-04 18:47:31

Вы можете сделать это с помощью usort asi:

function date_compare($a, $b)
{
    $t1 = strtotime($a['startDate']);
    $t2 = strtotime($b['startDate']);
    return $t1 - $t2;
}    
usort($arrayDatos, 'date_compare');
 1
Author: alanfcm, 2018-05-04 15:51:13