使用另一个数组作为键创建关联数组

3

我目前有一个名为$keys的数组:

array(5) {
  [0] =>
  string(9) "SessionID"
  [1] =>
  string(5) "Title"
  [2] =>
  string(11) "Description"
  [3] =>
  string(5) "Level"
  [4] =>
  string(4) "Type"
}
我用它作为另一个数组$values的键。

我想通过将另一个数组映射到$keys来创建一个关联数组。

换句话说,我想使用array_combine($keys, $values)创建一个关联数组,其中$keys只有5个元素,但$values有超过3000个元素。

编辑1:很抱歉没有放入$values的示例。它的顺序与$keys相同:

+-----------+-------+-------------+---------+------+
| SESSIONID | TITLE | DESCRIPTION |  LEVEL  | TYPE |
+-----------+-------+-------------+---------+------+
|           |       |             |         |      |
| 1         | A     | 描述A      | Level 1 | Word |
|           |       |             |         |      |
| 2         | B     | 描述B      | Level 2 | Word |
+-----------+-------+-------------+---------+------+

或者

$values = [
1, 'A', '描述A', 'Level 1', 'Word',
2, 'B', '描述B', 'Level 2', 'Word'
];

因为我从单个CSV文件中填充这两个数组。


1
请详细说明:“$keys只有5个元素,而$values有超过3000个元素。” $values是否是一个包含(3000+)个数组的数组,每个数组都有五个元素?如果不是,请解释如何将键“映射”到3000多个值上 - 提供示例数据和该数据的预期结果即可。 - VolkerK
1
那么$values是什么?它是5个与这些键匹配的值,然后另外5个值,以此类推吗? - Michael
@VolkerK $values 是一个包含3000多个值的一维数组,其中5个值匹配5个键,然后下一个5个值将匹配另外5个键,以此类推。 - Thanh-Châu Phạm
这个文件看起来是否与您发布的表格相似? - VolkerK
@VolkerK 这个文件看起来不像那个表格,我只是为了举例说明而制作的。 - Thanh-Châu Phạm
然后,不要介意,这是无用的。如果文件确实是CSV文件(并且非常广泛地解释该术语,该表格也将是某种csv格式),则fgetcsv + array_combine将是一个可能的候选项,并且$values作为一维数组会有点奇怪;-) - VolkerK
2个回答

3

由于您没有解释$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);

什么?没有生成器?或者LimitIterator?在我们进行猜测时,需要更多的想象力,请开个玩笑…… - VolkerK
@VolkerK,哈哈,抱歉让你失望了。感谢您的编辑 ;) - Michael

2
“如果值得做,就值得过度”,因此这里是第一部分稍微更加不必要复杂的版本,参考迈克尔的回答
<?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.generatorshttp://docs.php.net/class.norewinditeratorhttp://docs.php.net/class.limititerator
数组已经过时了(可恶的iterator_to_array):-D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接