#php #arrays #sorting
#php #массивы #сортировка
Вопрос:
Некоторое время застрял на этом, поэтому буду признателен за любую помощь. У меня есть один массив (слева), который содержит список элементов, цель состоит в том, чтобы отсортировать ключи другого массива (справа) по значениям из левого массива.
Левый массив
Array
(
[0] => ID
[1] => FirstName
[2] => LastName
[3] => Address
)
Правильный массив
Array
(
[0] => Array
(
[FirstName] => Pim
[Address] => Finland
[LastName] => Svensson
[ID] => 3
)
[1] => Array
(
[FirstName] => Emil
[Address] => Sweden
[LastName] => Malm
[ID] => 5
)
)
То, чего я пытаюсь достичь, было бы похоже на это
Array
(
[0] => Array
(
[ID] => 3
[FirstName] => Pim
[LastName] => Svensson
[Address] => Finland
)
Кто-нибудь? 🙂
О, я использую php 5.3, если это поможет!
Ответ №1:
$output = array();
foreach ( $right as $array ) {
foreach ( $left as $field ) {
$temp[$field] = $array[$field];
}
$output[] = $temp;
}
Ответ №2:
Вы можете использовать uksort()
который позволяет сортировать ключи массива с помощью определяемой пользователем функции. Например.:
function sort_by_array($array) {
// create a sorting function based on the order of the elements in the array
$sorter = function($a, $b) use ($array) {
// if key is not found in array that specifies the order, it is always smaller
if(!isset($array[$a])) return -1;
if($array[$a] > $array[$b]) {
return 1;
}
return ($array[$a] == $array[$b]) ? 0 : -1;
};
return $sorter;
}
// $array contains the records to sort
// $sort_array is the array that specifies the order
foreach($array as amp;$record) {
uksort($record, sort_by_array(array_flip($sort_array)));
}
Я использую возможность в 5.3 для динамического определения функций и использую array_flip()
для преобразования:
Array
(
[0] => ID
[1] => FirstName
[2] => LastName
[3] => Address
)
Для
Array
(
[ID] => 0
[FirstName] => 1
[LastName] => 2
[Address] => 3
)
Это упрощает последующее сравнение ключей.
Комментарии:
1. 1 за гибкость, но я думаю, что это слишком сложно для данного конкретного случая.
2. @chris: Да, в этом случае, в зависимости от того, что OP действительно хочет сделать с массивом, это может быть слишком сложным. Но мне было интересно, почему никто не упомянул этот метод, и я хотел показать, что это возможно.
Ответ №3:
Вы должны разнести массив, сохранить массив в переменной, подобной этой
$array = Array
(
[0] => Array
(
[ID] => 3
[FirstName] => Pim
[LastName] => Svensson
[Address] => Finland
);
а затем разнесите массив
после разнесения массива вы получите отдельные параметры массива, затем вы можете использовать функцию implode, чтобы упорядочить их в любом порядке по вашему желанию
Ответ №4:
Я бы сделал шаг назад и посмотрел, что вам действительно нужно сделать. Массив ассоциативен, поэтому вы можете получить доступ к нужному элементу мгновенно, верно? Таким образом, вам действительно не нужно, чтобы все было по порядку, если только вы не печатаете выходные данные с помощью foreach
.
Я бы предложил одно из следующих решений:
- Если вам нужно, чтобы «правильный» массив располагался в порядке следования ключей, то посмотрите на запрос к базе данных / аналогичный и выберите столбцы в том порядке, в котором они вам нужны.
- Для каждого пользователя, которого вы хотите напечатать, найдите порядок в «левом» массиве, затем выведите соответствующее значение этого ключа в «правом» массиве.
Комментарии:
1. Я ничего не выбираю из базы данных, я получаю массив из xml, который загружен с помощью simplexml!
Ответ №5:
Ну, ваш вопрос необычен, обычно ассоциативные массивы используются для решения любых проблем, связанных с «положением». В любом случае, есть много способов сделать то, что вы ищете, что вы ищете.
Вы можете использовать list(), но он основан на позиции:
foreach($oldArray as $o)
{
list($firstName,$lastName,$address,$id)=$oldArray;
$newArray[]=array($id,$firstName,$lastName,$address);
}
Но лучший способ решить вашу проблему — это заполнить массив непосредственно в правильном порядке вместо повторной сортировки после 🙂
Комментарии:
1. Спасибо! Я поддерживаю это, но я получаю информацию в формате xml из другого сервиса, таким образом, я не всегда могу гарантировать порядок данных. Таким образом, это странный квест! 🙂