【问题标题】:Turn each array item into key value pair将每个数组项变成键值对
【发布时间】:2021-11-10 22:10:23
【问题描述】:

我有两个数组。一个是颜色列表,第二个是键值对的关联数组。我的目标是从关联数组中获取键值对,并使它们成为颜色数组中每个项目的子数组。搜索 SO 给我带来了各种相邻的问题,但不是我具体遇到的问题。下面是两个示例数组,然后 $final 就是我想要实现的:

$colors = ['#eea845', '#64A0B4', '#003c50', '#FF5568', '#eee', '#5cb85c', '#5bc0de', '#f0ad4e', '#d9534f'];

$test = [
  'key1' => 'val1',
  'key2' => 'val2',
  'key3' => 'val3',
  'key4' => 'val4',
  'key5' => 'val5',
  'key6' => 'val6',
  'key7' => 'val7',
  'key8' => 'val8',
  'key9' => 'val9',
];

$final = [
   '#eea845' => [
      'name' => 'key1',
      'value' => 'val1',
   ],
   '#64A0B4' => [
      'name' => 'key2',
      'value' => 'val2',
   ],
   etc.....
]

我一直在研究 array_walkarray_map,并试图弄清楚如何结合 forforeach强>循环。我查看了此处给出的答案 (Append one array values as key value pair to another array php),但我不确定如何在已经存在的数组上使用它并能够获取每个数组的索引。例如,该解决方案使用 array_walk($array1, function(&$v, $k) use($array2) { $v['date'] = $array2[$k]; });,但我需要将 $array2 中的值添加到 $array1 中已有的项目中,而我尝试使用 $i 作为索引执行 function($i, $v, $k)在 $array1 中,这不起作用,$i 未定义。

我很困惑,不知道下一步该往哪里看。你会怎么做

return $colors[$i] => 
  [
   'name' => $test[$key], 
   'value' => $test[$name] 
  ]

?

(对于上下文,我正在使用它来获取输入到 Twig 模板中的值,这看起来是解决问题的一半的最佳方法。但是如果这方面太难了......)

【问题讨论】:

  • array_map 然后 array_combine

标签: php arrays


【解决方案1】:

有几种方法可以做到这一点。一种方法是在关联数组上使用foreach,这样您就可以在单独的变量中获取键和值,并使用next() 从第一个(索引)数组中获取相应的值:

foreach ($test as $key => $value) {
    $final[current($colors)] = ["name" => $key, "value" => $value];
    next($colors);
}

如果您已经在 $colors 上使用了 next(),则在开始此循环之前您必须调用 reset($colors)

【讨论】:

  • 或者使用array_shift(),如果突变/破坏$colors数组是可以容忍的。 3v4l.org/G96iD 或者不破坏$colors 同时保持一个计数器。 3v4l.org/eMmUf
【解决方案2】:

我会使用以下逻辑的foreach() 组合:

  1. 检查两个数组的长度是否相同。
  2. 使用foreach 遍历数组并填写最终数组。
  3. 我在这方面做得不好,但我使用$count 来跟踪索引。您可以使用 next($colors)current($colors) 之类的游标,但我不确定。
<?php
$colors = [
    '#eea845', '#64A0B4', '#003c50', '#FF5568', '#eee', '#5cb85c', '#5bc0de', '#f0ad4e', '#d9534f'
];

$test = [
  'key1' => 'val1',
  'key2' => 'val2',
  'key3' => 'val3',
  'key4' => 'val4',
  'key5' => 'val5',
  'key6' => 'val6',
  'key7' => 'val7',
  'key8' => 'val8',
  'key9' => 'val9',
];

if (count($colors) == count($test)) {
    $count = 0;
    $finalOne = array();
    foreach ($test as $key => $value) {
        $finalOne[$colors[$count]] = [
            "name" => $key,
            "value" => $value
        ];
        $count++;
    }
    print_r($finalOne);
} else {
    echo "Arrays are of not same length.";
}

输出

Array
(
    [#eea845] => Array
        (
            [name] => key1
            [value] => val1
        )

    [#64A0B4] => Array
        (
            [name] => key2
            [value] => val2
        )

    [#003c50] => Array
        (
            [name] => key3
            [value] => val3
        )

    [#FF5568] => Array
        (
            [name] => key4
            [value] => val4
        )

    [#eee] => Array
        (
            [name] => key5
            [value] => val5
        )

    [#5cb85c] => Array
        (
            [name] => key6
            [value] => val6
        )

    [#5bc0de] => Array
        (
            [name] => key7
            [value] => val7
        )

    [#f0ad4e] => Array
        (
            [name] => key8
            [value] => val8
        )

    [#d9534f] => Array
        (
            [name] => key9
            [value] => val9
        )

)

工作演示:http://sandbox.onlinephpfunctions.com/code/73fb63fab8ccbdb6f73c795572ae51a0d98acdb4

【讨论】:

  • 请使用 3v4l.org 作为您的演示沙箱。移动设备上的用户体验在 sandbox.onlinephpfunctions.com 上非常糟糕
  • @mickmackusa 这是我第一次听说 3v4l.org。非常感谢。 ❤️
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2017-05-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多