Создать ассоциативный массив, используя другой массив в качестве ключей

В настоящее время у меня есть $keys массив

 массив (5) {
  [0] =>
  строка (9) "SessionID"
  [1] =>
  строка (5) "Заголовок"
  [2] =>
  Строка (11) "Описание"
  [3] =>
  Строка (5) "Уровень"
  [4] =>
  Строка (4) "Тип"
} 
что я использую в качестве ключей для значений другого массива под названием $values,

Я хотел бы создать ассоциативный массив путем сопоставления другого массива с $keys,

Еще один способ сказать это, я хотел бы array_combine($keys, $values) в то время как $keys имеет только 5 элементов, но $values имеет более 3000 элементов.

Изменить 1: Извините, что не вставил $values пример. Это будет иметь тот же порядок, что и $keys:

+ ----------- + ------- + ------------- + --------- + ----- - +
| СЕССИОНИД | НАЗВАНИЕ | ОПИСАНИЕ | УРОВЕНЬ | ТИП |
+-----------+-------+-------------+---------+------+
|           |       |             |         |      |
| 1         | A     | Опишите A | Уровень 1 | Слово |
|           |       |             |         |      |
| 2         | Б | Опишите B     | Уровень 2 | Слово |
+ ----------- + ------- + ------------- + --------- + ----- - +

или же

$values ​​= [
1, "А", "Опишите А", "Уровень 1", "Слово",
2, "B", "Опишите B", "Уровень 2", "Слово"
];

так как я заполняю оба массива из одного файла CSV.

2 ответа

Решение

Так как вы пропустили объяснение того, что $values это я немного угадал. Вот два сценария.

Если все ваши значения находятся на одном уровне, как показано ниже, мы можем разделить их на части:

$keys = [ "SessionID", "Title", "Description", "Level", "Type", ];
$values = [
    1,
    "Title A",
    "Desc A",
    "Monster",
    "car",
    2,
    "Title B",
    "Desc B",
    "Devil",
    "car",
];

Разрежьте данные до массивов с длиной, равной количеству ключей.

$chunks = array_chunk($values, count($keys));

Затем сопоставьте их, используя array_combine как ты и предложил.

$ass = array_map(function ($chunk) use ($keys) {
    return array_combine($keys, $chunk);
}, $chunks);

Если ваш массив является массивом массивов (или строк), мы можем пропустить часть фрагмента и напрямую передать ее в функцию отображения:

$values = [
    [ 1, "Title A", "Desc A", "Monster", "car" ],
    [ 2, "Title B", "Desc B", "Devil", "car" ]
];

$ass = array_map(function ($chunk) use ($keys) {
    return array_combine($keys, $chunk);
}, $values);

Так как, если это того стоит, стоит переборщить, вот немного более сложная версия первой части ответа Майкла.

<?php
$keys = array("SessionID","Title","Description","Level","Type");

$it = new NoRewindIterator(gen_data());
do {
    $foo = array_combine(
        $keys,
        iterator_to_array(new LimitIterator($it, 0, 5))
    );
    var_export($foo); echo "\r\n";
}
while ( $it->valid() );

function gen_data() {   
    static $HOW_MANY_WOULD_YOU_LIKE = 100;

    $x = array("Session #","Title #","Desc #","Lvl #","Type #");
    for($i=0; $i<$HOW_MANY_WOULD_YOU_LIKE*5; $i++) {
        yield $x[$i%5].((int)($i/5)+1);
    }
}

см. http://docs.php.net/language.generators, http://docs.php.net/class.norewinditerator и http://docs.php.net/class.limititerator

Массивы так 2015 (darn iterator_to_array):-D

Другие вопросы по тегам