Реорганизация массива: нечетные записи как KEY, четные записи как VALUE

Я пытаюсь закончить маршрутизатор URL-адресов, который я создал для своей пользовательской среды MVC. У меня есть список параметров, которые я выделил из URL, но проблема в том, что они имеют только числовые ключи. Что я хочу сделать, так это настроить его так, чтобы первое значение в массиве $params было КЛЮЧОМ, а второе значение в массиве было ЗНАЧЕНИЕМ первого КЛЮЧА. Но мне нужно пойти еще дальше. По сути, мне нужно, чтобы все значения ключа с нечетным числом в массиве были новым KEY, а значение ключа с четным числом было значением.

Пример:

Вот как это СЕЙЧАС настроено:

Array
(
  [0] => greeting
  [1] => hello
  [2] => question
  [3] => how-are-you
  [4] => response
  [5] => im-fine
)

Вот как это ДОЛЖНО быть (после преобразования):

Array
(
  [greeting] => hello
  [question] => how-are-you
  [response] => im-fine
)

Было бы проще создать массив такого типа, когда я разбиваю строку разделителем '/', когда я вынимаю ее из строки URL? Если да, то какая функция лучше всего подходит для этого?

Вероятно, это простое решение, потому что я уверен, что это распространенная проблема, но какое просветление?


person cshoffie    schedule 14.12.2011    source источник
comment
Я думаю, что был с вами, пока вы не сказали, что хотите, чтобы первый индекс (0) был ключом, а затем вы сказали, что хотите, чтобы нечетные индексы были ключом. Вы имеете в виду: начиная с нуля, возьмите первое значение как ключ, второе как значение и поместите в карту, и сделайте это для каждой пары ключ/значение?   -  person Roger Lindsjö    schedule 14.12.2011


Ответы (7)


Может быть, для этого использовать array_splice()?

$result = array();

while (count($urls)) {
    list($key,$value) = array_splice($urls, 0, 2);
    $result[$key] = $value;
}

Это позволит извлечь первые две записи из списка URL-адресов и использовать их в качестве ключа и значения для результирующего массива. Повторяется до тех пор, пока список источников не станет пустым.

person Linus Kleen    schedule 14.12.2011
comment
Я попробую это... Если в массиве нечетное количество записей, будет ли экспортирована ошибка? - person cshoffie; 14.12.2011
comment
@cshoffie да, было бы. Поскольку array_splice даст одноэлементный массив, а list ожидает два элемента. Вы получите Notice: Undefined offset: 1 in .... on line ... - person Yoshi; 14.12.2011

Что-то типа:

$data = array (
  'greeting',
  'hello',
  'question',
  'how-are-you',
  'response',
  'im-fine',
);

$new = array();

for ($i = 0, $lim = sizeof($data); $i < $lim; $i += 2) {
  $new[$data[$i]] = isset($data[$i + 1]) ? $data[$i + 1] : null;
}

print_r($new);
person Yoshi    schedule 14.12.2011

Я не знаю, лучшее ли это решение, но то, что я сделал, это

           $previousElement = null;
            foreach ($features as $key => $feature) {
                //check if key is even, otherwise it's odd
                if ($key % 2 === 0) {
                    $features[$feature] = $feature;
                } else {
                    $features[$previousElement] = $feature;
                }
                //saving element so I can "remember" it in next loop
                $previousElement = $feature;
                unset($features[$key]);
            }
person Vladyslav Startsev    schedule 19.04.2017

Лучший способ сделать это - разбить его на части и использовать в списке.

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine");

$assoc = array();
   foreach (array_chunk($array, 2) as $pair) {
   list($key, $value) = $pair;
   $assoc[$key] = $value;
}

var_export($assoc);

/*
   array (
       'greeting' => 'hello',
       'question' => 'how-are-you',
       'response' => 'im-fine',
  )
*/

найдено здесь

person Ganbayar Gansukh    schedule 16.01.2018

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

$array = array("greeting", "hello", "question", "how-are-you", "response", "im-fine");
$res = array();
for($i=0; $i < count($array); $i+=2){
    $res[$array[$i]] = $array[$i+1];
}
person NappingRabbit    schedule 16.01.2018

И однострочник, который мы все ищем:

array_combine(array_filter($urls, function ($k) {return !($k&1);}, ARRAY_FILTER_USE_KEY), array_filter($urls, function ($k) {return ($k&1);}, ARRAY_FILTER_USE_KEY));
person Jay    schedule 28.09.2020

person    schedule
comment
Рабочий код.... Проверено - person Udit Kumar; 22.07.2021
comment
Немного вспомогательного текста поможет этому ответу только для кода. Тем более, что у тебя было 10 лет, чтобы это придумать. - person Wyck; 22.07.2021