【问题标题】:how to merge two array in even sequence in PHP? [duplicate]如何在PHP中以偶数顺序合并两个数组? [复制]
【发布时间】:2018-02-23 09:46:51
【问题描述】:

如何均匀地合并这两个数组?谢谢。

$array1 = ['1','3','5'];
$array2 = ['2','4','6'];

// Output
['1','2','3','4','5','6']

我目前的做法

$items = [];
    $totalItem = count($array1) + count($array2);
    while ($totalItem > 0) {
        if (count($array1) > 0) {
            array_push($items, array_shift($array1));
        }
        if (count($array2) > 0) {
            array_push($items, array_shift($array2));
        }
        $totalItem -= 1;
    }

我实际上正在寻找一种更有效的方法。提前感谢你们提供的任何想法:-)

【问题讨论】:

  • 您是要合并然后排序,还是要得到一个数组,例如:[$array1[0], $array2[0], $array1[1], $array2[1], $array1[2], $array2[2]], etc.
  • 为什么不直接使用array_merge($array1, $array2);
  • 您是否希望一个数组中的值与另一个数组相同?在这种情况下,它们都是不同的,但它们会一直如此吗?
  • 你有没有尝试合并它们然后排序?
  • @scagood 是的,我希望像这样合并两个数组 [$array1[0], $array2[0], $array1[1], $array2[1], $array1[2], $array2[2]] 没有排序。可以用现有的 php 函数来做到这一点吗?谢谢

标签: php laravel


【解决方案1】:

如果您的值具有一定程度的复杂性,请合并它们并使用asort

$unsorted = array_merge($array1, $array2);
asort($unsorted);

【讨论】:

    【解决方案2】:

    如果这些数组可以有不同的大小,有自定义键等,如果 ['1','2','3','4','5','6'] 只是一个简单的例子,值可以是任何类型的数据,那么这样做:

    $result = [];
    
    // Get rid of custom keys
    $array1 = array_values($array1);
    $array2 = array_values($array2);
    
    $arrayCount = max(count($array1), count($array2));
    
    for ($i = 0; $i < $arrayCount; $i++) {
        if (isset($array1[$i]) {
            $result = $array1[$i];
        }
    
        if (isset($array2[$i]) {
            $result = $array2[$i];
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果你使用数组,你可以使用

      sort(array_merge($array1, $array2))

      但是,如果您使用 Laravel,我强烈建议您查看 Collections(可以在此处找到文档 https://laravel.com/docs/5.6/collections)。

      有了集合,你就可以调用

      $collection1-&gt;merge($collection2)-&gt;sort();

      您甚至可以将匿名函数作为参数传入,以便使用集合进行更复杂的排序。

      $collection1->merge($collection2)->sort(function($a, $b) {
          if ($a == $b) {
              return 0;
          }
          return ($a < $b) ? -1 : 1;
      })
      

      【讨论】:

        【解决方案4】:

        试试这个示例代码:

        $result = array_merge($array1, $array2);
        sort($result);
        var_dump($result);
        

        【讨论】:

          【解决方案5】:

          所以,我不确定您是否想要 array_merge(); sort(); 或“按键的顺序合并值”类型的答案,所以这里两者兼而有之。

          首先是简单的“合并 -> 排序”示例

          $array1 = array('1', '5', '3');
          $array2 = array('2', '4', '6');
          
          // Perform a standard merge
          $array = array_merge ($array1, $array2);
          // $array looks like this:
          // $array = ['1', '5', '3', '2', '4', '6'];    
          
          // So sort it.
          sort($array);
          
          // And we get the following, note it will lose the key order.
          // $array = ['1', '2', '3', '4', '5', '6'];
          

          如果您想以“键 -> 数组编号”的顺序合并数组,则可以执行以下操作:

          function merge($array1, $array2) {
              $arrays = func_get_args();
              $lengths = array();
              $output = array();
          
              // First find the longest array.
              foreach ($arrays as $key => $array) {
                  // Remove the keys.
                  $arrays[$key] = array_values($array);
          
                  // Find the length.
                  $lengths[] = count($array);
              }
          
              // Get the dimensions.
              $length = max($lengths);
              $count = count($arrays);
          
              // For each element (of the longest array)
              for ($x = 0; $x < $length; $x++)
          
              // For each array
              for ($y = 0; $y < $count; $y++)
          
              // If the value exists
              if (isset($arrays[$y][$x]))
          
              // Add it to the output
              $output[] = $arrays[$y][$x];
          
              return $output;
          }
          
          $array1 = array('1', '5', '3');
          $array2 = array('2', '4', '6');
          $array = merge($array1, $array2);
          /* Output: 
          Array
            (
              [0] => 1
              [1] => 2
              [2] => 5
              [3] => 4
              [4] => 3
              [5] => 6
            )
          */
          
          $array3 = array('a', 't', 'u', 'i', 'w');
          $array = merge($array1, $array2, $array3);
          /* Output: 
          Array
            (
              [0] => 1
              [1] => 2
              [2] => a
              [3] => 5
              [4] => 4
              [5] => t
              [6] => 3
              [7] => 6
              [8] => u
              [9] => i
              [10] => w
            )
          */
          

          我会用“我没有尝试过这段代码”来警告这一点,但据我所知,它“应该”工作。

          【讨论】:

            猜你喜欢
            • 2020-01-03
            • 1970-01-01
            • 2016-03-08
            • 1970-01-01
            • 2018-09-10
            • 1970-01-01
            • 1970-01-01
            • 2016-03-13
            • 2020-07-09
            相关资源
            最近更新 更多