Сортировать массив по свойству объекта в PHP? - PullRequest
52 голосов
/ 23 сентября 2009

Если у меня есть объект как таковой:

class Person {
  var $age;
  function __construct($age) {
    $this->age = $age;
  }
}

и у меня есть любой массив Person s

$person1 = new Person(14);
$person2 = new Person(5);
$people = array($person1, $person2);

Существует ли простой способ сортировки массива $people по свойству Person->age?

Ответы [ 15 ]

1 голос
/ 01 ноября 2010

Если все рассматриваемые переменные-члены гарантированно будут разными, будет проще и быстрее создать новую коллекцию, индексированную этими значениями, а затем ksort it:

 foreach($obj_list as $obj)
    $map[$obj->some_var] = $obj;
 ksort($map);
 /// $map now contains the sorted list

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

 foreach($obj_list as $obj)
    $map[] = array($obj->some_var, $obj);
 sort($map); // sorts $map by the value of ->some_var

Я думаю, это все равно будет в 10000000 раз быстрее, чем usort

1 голос
/ 01 ноября 2010

Попробуйте usort: http://www.php.net/manual/en/function.usort.php

Пример:

<?php
function cmp($obja, $objb)
{
    $a = $obja->sortField;
    $b = $objb->sortField;
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array( /* your objects */ );

usort($a, "cmp");

?>
1 голос
/ 23 сентября 2009

Да. Если вы реализуете spl ArrayObject в вашем объекте person, все обычные функции массива php будут работать с ним правильно.

1 голос
/ 23 сентября 2009

usort() или uasort() /* to maintain index association if you were using an associative array */

0 голосов
/ 08 июля 2015

Вот опция, которая учитывает следующие вещи:

  • Пространства имен
  • частная собственность
  • с использованием методов получения и установки
  • свойство для сортировки в качестве параметра

PHP

namespace Dummy;

class Person {

    private $age;

    function __construct($age) {
        $this->setAge($age);
    }

    public function getAge()
    {
        return $this->age;
    }

    public function setAge($age)
    {
        $this->age = $age;
    }
}

class CustomSort{

    public $field = '';

    public function cmp($a, $b)
    {
        return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
    }

    public function sortObjectArrayByField($array, $field)
    {
        $this->field = $field;
        usort($array, array("Dummy\CustomSort", "cmp"));
        return $array;
    }
}

$robert = new Person(20);
$peter = new Person(12);
$robin = new Person(44);
$people = array($robert, $peter, $robin);

var_dump( $people );

$customSort = new CustomSort();
$people = $customSort->sortObjectArrayByField($people, 'age');

var_dump( $people );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...