PHP функция usort на массиве объектов не работает - PullRequest
3 голосов
/ 14 января 2020

У меня есть следующий массив объектов:

 array (
   0 => MyObject::__set_state(array(
      'id' => '1176',
      'value' => 'Oranges',
   )),
   1 => MyObject::__set_state(array(
      'id' => '1178',
      'value' => 'Bananas',
   )),
   2 => MyObject::__set_state(array(
      'id' => '1179',
      'value' => 'grapes',
   )),
 )

Я хочу отсортировать по возрастанию по значению, поэтому я использую следующее:

usort($myObjectArray, function($a, $b) {
    return strcmp($a->value, $b->value);
});  

Но я ничего не сортирую?

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Начиная с php 7, вы можете использовать оператор космического корабля в функции сравнения.

Я только что проверил его с помощью приведенного ниже кода, и он работал так, как вы и ожидали, без каких-либо необходимо сделать регистр единообразным.

Примечание. Я только что создал массив из stdClass объектов путем приведения массивов.

$objArr = [
   (Object) [
      'id' => '1176',
      'value' => 'Oranges',
   ],
   (Object) [
      'id' => '1178',
      'value' => 'Bananas',
   ],
   (Object) [
      'id' => '1179',
      'value' => 'grapes',
   ],
];
usort($objArr, function($a, $b) {
    // use return $b->value <=> $a->value; 
    // to reverse order
    return $a->value <=> $b->value;
});

, что приводит к следующему:

print_r($objArr);

Array
(
    [0] => stdClass Object
        (
            [id] => 1178
            [value] => Bananas
        )

    [1] => stdClass Object
        (
            [id] => 1176
            [value] => Oranges
        )

    [2] => stdClass Object
        (
            [id] => 1179
            [value] => grapes
        )

)

Полезно, если дело касается проблемы (т. Е. Сортировать виноград и виноград).

0 голосов
/ 14 января 2020

Вы можете попробовать код ниже. Я проверил, что все работает нормально:

class MyObject
{
    public $id;
    public $value;
}

$a = [];

$ob = new MyObject();
$ob->id = '1176';
$ob->value = 'Lemons';

$ob2 = new MyObject();
$ob2->id = '1178';
$ob2->value = 'apples';

$ob3 = new MyObject();
$ob3->id = '1179';
$ob3->value = 'grapes';

$a[] = $ob;
$a[1] = $ob2;
$a[2] = $ob3;

usort( $a, function($a, $b) {
    return strcmp(mb_strtolower($a->value), mb_strtolower($b->value));
});


print_r($a);

Вывод:

Array
(
    [0] => MyObject Object
        (
            [id] => 1178
            [value] => apples
        )

    [1] => MyObject Object
        (
            [id] => 1179
            [value] => grapes
        )

    [2] => MyObject Object
        (
            [id] => 1176
            [value] => Lemons
        )

)

Также вы можете проверить - Do c

0 голосов
/ 14 января 2020

Вы можете сделать так:

function cmp($a, $b) {
    return strcmp($a->value, $b->value);
}); 
usort($myObjectArray,"cmp");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...