массивы — сортировать подмассив n-го уровня

Давайте предположим, что у меня есть вложенный массив PHP $aaa где
Вход $aaa[$bbb][$ccc] как

array(0 => array('x' => 3, 'y' => 2), 1 => array('x' => 2, 'y' => 1), 2 => array('x' => 4, 'y' => 1))

и скажем, я хочу заказать только этот массив x значение для того, чтобы получить массив

array(0 => array('x' => 2, 'y' => 1), 1 => array('x' => 3, 'y' => 2), 2 => array('x' => 4, 'y' => 1))

и не изменять все остальные подмассивы.
Как мне это сделать? Я не могу сделать это с usort и пользовательская функция.

1

Решение

Все же это Можно быть сделано с usort

$arr = array(
0 => array('x' => 3, 'y' => 2),
1 => array('x' => 2, 'y' => 1),
2 => array('x' => 4, 'y' => 1)
);

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

usort($arr, "cmp");

var_dump($arr);

Результат

array(3) {
[0]=>
array(2) {
["x"]=>
int(2)
["y"]=>
int(1)
}
[1]=>
array(2) {
["x"]=>
int(3)
["y"]=>
int(2)
}
[2]=>
array(2) {
["x"]=>
int(4)
["y"]=>
int(1)
}
}
3

Другие решения

usort является простой способ сделать это (не ясно, почему ваш не сработал), и если вы используете PHP 7, это отличная возможность использовать одну из новых функций, <=>, оператор комбинированного сравнения, (Ака космический корабль).

usort($your_array, function($a, $b) {
return $a['x'] <=> $b['x'];
});

Оператор космического корабля используется для сравнения двух выражений. Возвращает -1, 0 или 1, когда $ a соответственно меньше, равно или больше, чем $ b.

(Если вы не используете PHP 7, то, конечно, вы все еще можете использовать usort с другой функцией сравнения или другими подходами, как показали другие ответы здесь.)

1

Вы можете использовать с usort как ниже:

<?php
function compare_func($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}

$name = array(0 => array('x' => 3, 'y' => 2), 1 => array('x' => 2, 'y' => 1), 2 => array('x' => 4, 'y' => 1));
usort($name, compare_func('x'));
print_r($name);
?>

Выход : Array ( [0] => Array ( [x] => 2 [y] => 1 ) [1] => Array ( [x] => 3 [y] => 2 ) [2] => Array ( [x] => 4 [y] => 1 ) )

Больше подробностей http://php.net/manual/en/function.usort.php

0

Предполагая, что вы определили $bbb а также $ccc в качестве ключей; извлечь x ключи из массива и сортировать его, сортируя исходный массив:

array_multisort(array_column($aaa[$bbb][$ccc], 'x'), $aaa[$bbb][$ccc]);
0
По вопросам рекламы [email protected]