Изменить порядок индексов в массиве

#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. Если вам нужно, чтобы «правильный» массив располагался в порядке следования ключей, то посмотрите на запрос к базе данных / аналогичный и выберите столбцы в том порядке, в котором они вам нужны.
  2. Для каждого пользователя, которого вы хотите напечатать, найдите порядок в «левом» массиве, затем выведите соответствующее значение этого ключа в «правом» массиве.

Комментарии:

1. Я ничего не выбираю из базы данных, я получаю массив из xml, который загружен с помощью simplexml!

Ответ №5:

Ну, ваш вопрос необычен, обычно ассоциативные массивы используются для решения любых проблем, связанных с «положением». В любом случае, есть много способов сделать то, что вы ищете, что вы ищете.

Вы можете использовать list(), но он основан на позиции:

 foreach($oldArray as $o)
{
    list($firstName,$lastName,$address,$id)=$oldArray;
    $newArray[]=array($id,$firstName,$lastName,$address);
}
  

Но лучший способ решить вашу проблему — это заполнить массив непосредственно в правильном порядке вместо повторной сортировки после 🙂

Комментарии:

1. Спасибо! Я поддерживаю это, но я получаю информацию в формате xml из другого сервиса, таким образом, я не всегда могу гарантировать порядок данных. Таким образом, это странный квест! 🙂