Изменить порядок индекса в массиве - PullRequest
5 голосов
/ 24 апреля 2010

Я немного застрял на этом, так что любая помощь будет принята с благодарностью. У меня есть один массив (слева), который содержит список элементов, цель состоит в том, чтобы отсортировать другие массивы (справа) ключей по значениям из массива слева.

Левый массив

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, если это поможет!

Ответы [ 5 ]

8 голосов
/ 24 апреля 2010
$output = array();
foreach ( $right as $array ) {
    foreach ( $left as $field ) {
        $temp[$field] = $array[$field];
    }
    $output[] = $temp;
}
3 голосов
/ 24 апреля 2010

Вы можете использовать uksort(), что позволяет сортировать ключи массива с помощью определенной пользователем функции. E.g.:

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 &$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
)

Это облегчает сравнение ключей позже.

2 голосов
/ 24 апреля 2010

Вы должны взорвать массив Сохраните массив в такой переменной, как эта

$array = Array
(
    [0] => Array
    (
        [ID] => 3
        [FirstName] => Pim
        [LastName] => Svensson
        [Address] => Finland
    );

и затем взорвать массив после взрыва массива вы получите разделенные параметры массива, затем вы можете использовать функцию implode и расположить их в любом порядке по вашему желанию

0 голосов
/ 24 апреля 2010

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

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

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

Но лучший способ решить вашу проблему - заполнить массив напрямую в правильном порядке, а не пересортировать после:)

0 голосов
/ 24 апреля 2010

Я бы сделал шаг назад и посмотрел бы, что вам действительно нужно сделать. Массив является ассоциативным, поэтому вы можете мгновенно получить доступ к нужному элементу, верно? Так что вам не нужно, чтобы он был в порядке, если вы не печатаете вывод с foreach.

Я бы предложил одно из следующих решений:

  1. Если вам нужно , то "правильный" массив должен быть в порядке ключей, затем посмотрите на запрос к базе данных / аналогичный и выберите столбцы в том порядке, в котором они вам нужны.
  2. Для каждого человека, которого вы хотите напечатать, найдите порядок в массиве «left», затем напечатайте соответствующее значение этого ключа в массиве «right».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...