lithium\util\Set::sort PHP Method

sort() public static method

Sorts an array by any value, determined by a Set-compatible path.
public static sort ( array $data, string $path, string $dir = 'asc' ) : array
$data array
$path string A `Set`-compatible path to the array value.
$dir string Either `'asc'` (the default) or `'desc'`.
return array
    public static function sort($data, $path, $dir = 'asc')
    {
        $flatten = function ($flatten, $results, $key = null) {
            $stack = array();
            foreach ((array) $results as $k => $r) {
                $id = $k;
                if ($key !== null) {
                    $id = $key;
                }
                if (is_array($r)) {
                    $stack = array_merge($stack, $flatten($flatten, $r, $id));
                } else {
                    $stack[] = array('id' => $id, 'value' => $r);
                }
            }
            return $stack;
        };
        $extract = static::extract($data, $path);
        $result = $flatten($flatten, $extract);
        $keys = static::extract($result, '/id');
        $values = static::extract($result, '/value');
        $dir = $dir === 'desc' ? SORT_DESC : SORT_ASC;
        array_multisort($values, $dir, $keys, $dir);
        $sorted = array();
        $keys = array_unique($keys);
        foreach ($keys as $k) {
            $sorted[] = $data[$k];
        }
        return $sorted;
    }

Usage Example

Beispiel #1
0
	public function testSort() {
		$a = array(
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate'))),
			array('Person' => array('name' => 'Tracy'), 'Friend' => array(
				array('name' => 'Lindsay')
			))
		);
		$b = array(
			array('Person' => array('name' => 'Tracy'),'Friend' => array(
				array('name' => 'Lindsay')
			)),
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate')))
		);
		$a = Set::sort($a, '/Friend/name', 'asc');
		$this->assertIdentical($a, $b);

		$b = array(
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate'))),
			array('Person' => array('name' => 'Tracy'), 'Friend' => array(
				array('name' => 'Lindsay')
			))
		);
		$a = array(
			array('Person' => array('name' => 'Tracy'), 'Friend' => array(
				array('name' => 'Lindsay')
			)),
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate')))
		);
		$a = Set::sort($a, '/Friend/name', 'desc');
		$this->assertIdentical($a, $b);

		$a = array(
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate'))),
			array('Person' => array('name' => 'Tracy'), 'Friend' => array(
				array('name' => 'Lindsay')
			)),
			array('Person' => array('name' => 'Adam'), 'Friend' => array(array('name' => 'Bob')))
		);
		$b = array(
			array('Person' => array('name' => 'Adam'),'Friend' => array(array('name' => 'Bob'))),
			array('Person' => array('name' => 'Jeff'), 'Friend' => array(array('name' => 'Nate'))),
			array('Person' => array('name' => 'Tracy'), 'Friend' => array(
				array('name' => 'Lindsay')
			))
		);
		$a = Set::sort($a, '/Person/name', 'asc');
		$this->assertIdentical($a, $b);

		$a = array(array(7, 6, 4), array(3, 4, 5), array(3, 2, 1));
		$b = array(array(3, 2, 1), array(3, 4, 5), array(7, 6, 4));

		$a = Set::sort($a, '/', 'asc');
		$this->assertIdentical($a, $b);

		$a = array(array(7, 6, 4), array(3, 4, 5), array(3, 2, array(1, 1, 1)));
		$b = array(array(3, 2, array(1, 1, 1)), array(3, 4, 5), array(7, 6, 4));

		$a = Set::sort($a, '/.', 'asc');
		$this->assertIdentical($a, $b);

		$a = array(
			array('Person' => array('name' => 'Jeff')),
			array('Shirt' => array('color' => 'black'))
		);
		$b = array(array('Person' => array('name' => 'Jeff')));
		$a = Set::sort($a, '/Person/name', 'asc');
		$this->assertIdentical($a, $b);
	}