Реорганизация массива: нечетные записи как KEY, четные записи как VALUE - PullRequest
8 голосов
/ 14 декабря 2011

Я пытаюсь завершить создание маршрутизатора URL, который я создал для своей пользовательской инфраструктуры MVC.У меня есть список параметров, которые я извлек из URL, но проблема в том, что они имеют только цифровые ключи.Я хочу установить его так, чтобы первое значение в массиве $ params было KEY, а затем второе значение в массиве - это VALUE первого 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?Если да, то какая функция для этого лучше?

Возможно, это простое решение, потому что я уверен, что это обычная проблема, но любое просвещение?

Ответы [ 5 ]

8 голосов
/ 14 декабря 2011

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

$result = array();

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

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

1 голос
/ 14 декабря 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);
0 голосов
/ 16 января 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];
}
0 голосов
/ 16 января 2018

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

$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',
  )
*/

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

0 голосов
/ 19 апреля 2017

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

           $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]);
            }
...