0

たとえば、2つの配列を交差させることができる関数が必要です

$Array1 = array(1,2,3);
$Array2 = array(5,6);

リセアンブル:

$Array3 = array(1,5,2,6,3);

私が今まで持っているのはこれです

<?php
$Array1 = array(1,2,3);
$Array2 = array(5,6);

function zip() {
    $args = func_get_args();
    $zipped = array();
    $n = count($args);
    for ($i=0; $i<$n; ++$i) {
        reset($args[$i]);
    }
    while ($n) {
        $tmp = array();
        for ($i=0; $i<$n; ++$i) {
            if (key($args[$i]) === null) {
                break 2;
            }
            $tmp[] = current($args[$i]);
            next($args[$i]);
        }
        $zipped[] = $tmp;
    }
    return $zipped;
}

$bothMonths = zip($Array1, $Array2);

print_r($bothMonths);

?>

次のような出力があります

Array (
    [0] => Array (
        [0] => 1
        [1] => 5
    )
    [1] => Array (
        [0] => 2
        [1] => 6
    )
)

ここで3が欠落していますが、理由はわかりません

また、純粋プログラミングが必要で、忘れてしまったarray_mergearray_intersect...または他の関数

ありがとうございました。

4

2 に答える 2

4
// Interleaves arbitrarily many input arrays. Example:
// a1 = [1, 2, 3], a2 = [5, 6], a3 = [7, 8, 9]
// zip(a1, a2, a3) => [1, 5, 7, 2, 6, 8, 3, 9]
function zip() {
  $arrays = func_get_args();
  $result = array();

  // Count the length of the arrays to get the length of the longest
  $longest = array_reduce($arrays, function($old, $e) {
      return max($old, count($e));
    }, 0);

  // Traverse the arrays, one element at a time
  for ($i = 0; $i < $longest; $i++) {
    foreach($arrays as $a) {
      if (isset($a[$i]))
        $result[] = $a[$i];
    }
  }

  return $result;
}

これは、配列が0以上の数値でインデックス付けされていることを前提としています。

于 2012-06-18T12:17:27.607 に答える
2

これを試して:

function custom_intersect($arr1, $arr2) {
   $len1 = count($arr1);
   $len2 = count($arr2);
   $max_len = ($len1 >= $len2) ? $len1 : $len2;

   $arr = array();
   for($i = 0; $i < $max_len; ++$i)
   {
      if(isset($arr1[$i]))
      {
         $arr[] = $arr1[$i];
      }
      if(isset($arr2[$i]))
      {
         $arr[] = $arr2[$i];
      }
   }
   return $arr;
}
于 2012-06-18T12:17:00.137 に答える