【问题标题】:How can I combine array's items? [duplicate]如何组合数组的项目? [复制]
【发布时间】:2017-11-13 14:01:11
【问题描述】:

这里是my code

$arr = [
    0 => [1, 2, 3, 4],
    1 => ['one', 'two', 'three', 'four'] 
    ];

$res = [];    
foreach ($arr as $item){
    foreach($item as $i){
        $res = [$i, $item];
    }
}

print_r($res);

/*
Array
(
    [0] => four
    [1] => Array
        (
            [0] => one
            [1] => two
            [2] => three
            [3] => four
        )

)

如您所见,结果没有任何意义。这是预期的结果:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
        )
    [1] => Array
        (
            [0] => 2
            [1] => two
        )
    [2] => Array
        (
            [0] => 3
            [1] => three
        )
    [3] => Array
        (
            [0] => 4
            [1] => four
        )
)

你知道,嵌套循环总是让我感到困惑。无论如何,有人知道我怎样才能达到预期的效果吗?

【问题讨论】:

标签: php for-loop


【解决方案1】:

更新

或者,正如下面 Shafizadeh 所说,简单地说:

<?php
$arr = [
    [1, 2, 3, 4],
    ['one', 'two', 'three', 'four']
];

$out = array_map(null, ...$arr);

这个?

<?php
$arr = [
    [1, 2, 3, 4],
    ['one', 'two', 'three', 'four']
];

// array_map accepts an open number of input arrays and applies
// a given callback on each *set* of *i-th* values from these arrays.
// The return value of the callback will be the new array value
// of the final array:
                            // get all function arguments as an array
$out = array_map(function (...$r) {
    return $r;
}, ...$arr); // *spread* input array as individual input arguments

print_r($out);

// Array
// (
//     [0] => Array
//         (
//             [0] => 1
//             [1] => one
//         )
// 
//     [1] => Array
//         (
//             [0] => 2
//             [1] => two
//         )
// ...

演示:https://3v4l.org/uJNKG

参考:http://php.net/manual/functions.arguments.php#functions.variable-arg-list.new

【讨论】:

  • @MartinAJ 这是可变参数语法。 php.net/manual/en/functions.arguments.php
  • @KrisRoofe 我明白了。您可以将... 运算符视为简单的语法糖。这意味着它使您无需在特定位置编写循环(调用函数/方法,使用函数/方法参数)。所以在我的回答中,我结合了这种用法和内置的array_map 函数。碰巧两者都可以很好地协同工作。
  • @Shafizadeh 不错!只要这个问题保持关闭,我认为您不能将其添加为答案。到时候我就先收藏了。
【解决方案2】:

试着想象一下如果你用手来做这件事你会做什么:

  • 第一步:从数组 A 中取一个值,从数组 B 中取一个值在一个特定位置(我们称之为$i)。
  • 第二步:将这两个值添加到新数组 C 中。
  • 第三步:将$i加一
  • 第四步:重复此操作,直到遍历整个数组。

【讨论】:

    【解决方案3】:

    您可以通过单个 for 循环使用 array_column() 来实现此目的。

    $arr = [
        0 => [1, 2, 3, 4],
        1 => ['one', 'two', 'three', 'four'] 
        ];
    
    $res = [];    
    foreach ($arr[0] as $key => $val){
         $res[] = array_column($arr, $key);
    }
    

    以下是工作示例:https://3v4l.org/vXdvD

    【讨论】:

      【解决方案4】:

      使用foreach$key =&gt; $value 语法迭代第一个子数组,将迭代索引处的元素(即$item)与来自第二个子数组的相应元素(即$arr[1][$key])组合:

      foreach ($arr[0] as $key => $item) {
          $res[] = [$item, $arr[1][$key] ];
      }
      

      观看演示here

      更新

      我承认我从Yoshianswer 中了解到spread operator - 我知道它存在于JavaScript 中但不存在于PHP 中。下面的解释开始应用 array_map() 而不使用扩展运算符,然后应用它。

      要开始应用array_map(),第一个参数是anonymous function,它在单个数组中返回它接受的两个参数。第二个和第三个参数是两个子数组。

      $arr = [
          0 => [1, 2, 3, 4],
          1 => ['one', 'two', 'three', 'four'] 
          ];
      
      $res = array_map(function($item0, $item1) {
          return [ $item0, $item1];
      }, $arr[0], $arr[1]);
      
      print_r($res);
      

      查看演示here

      然后使用该代码,展开运算符可用于替换匿名函数的参数(即$item0, $item1)以及array_map() 的第二个和第三个参数(即$arr[0], $arr[1]

      $res = array_map(function(...$items) {
          return $items;
      }, ...$arr);
      

      查看here 的演示。

      【讨论】:

        【解决方案5】:
        $arr = [
          0 => [1, 2, 3, 4],
          1 => ['one', 'two', 'three', 'four']
        ];
        $res = [];
        foreach ($arr[0] as $key => $item) {
          $res[] = [$item, $arr[1][$key] ];
        }
        print_r($res);
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 2018-10-15
        • 2017-07-16
        • 1970-01-01
        相关资源
        最近更新 更多