从一个数组中显示前四个元素,从另一个数组中显示第一个元素,直到数组元素存在。

4

我将尝试创建一个由数字组成的第三个数组,其中包括第一个数组中的前四个元素、第二个数组中的前一个元素,以此类推。

示例:

A1 { 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 21, 22, 23, 24, 25 }
A2 {11, 12, 13, 14, 15, 16, 17, 18, 19, 20 } 

结果应该是:

A3 { 1, 2, 3, 4, 11, 5, 6, 7, 8, 12, 9, 10, 21, 22, 13, ... }
     └───┬────┘  ↑↑  └───┬────┘  ↑↑  └─────┬─────┘  ↑↑
         A1      A2      A1      A2        A1       A2 

我尝试了这段代码,但它没有显示第二个数组中的所有元素。

<?php

    $array = array(1, 2, 3, 4, 5,6,7,8,9,10);
    $array2 = array(11, 12, 13, 14, 15 ,16,17,18,19,20);

    $temp = 0;

    foreach ($array as $key => $item)
    {
        echo $item;

        if(($key+1) % 4 == '0')
        {
            echo $array2[$temp];
            $temp++;
        } 
    }


?>

从A!中取出22后,您将剩下A1(23、24、25)和A2(14、15、16、17、18、19、20)。那么现在应该如何工作呢?因为A1只剩下3个元素。 - Object Manipulator
4个回答

2

解释

在这里,我首先使用array_chunk()将第一个数组每4个元素一组进行划分,将第二个数组每1个元素一组进行划分,代码如下:

//Array one
Array (
    Array (
        //4 array elements
    )
    //...
)

//Array two
Array (
    Array (
        //1 array elements
    )
    //...
)

然后,您可以使用array_map()同时循环遍历这两个数组,并使用array_merge()将这两个数组合并在一起。由于这两个数组的元素数量可能不均匀,因此我使用is_array()检查我们是否仍有要合并的元素数组,或者我们必须对array_merge()使用一个空数组。
因此,在array_map()之后,我们得到了一个二维数组,每个子数组包含第一个数组中的4个元素和第二个数组中的1个元素,就像这样:
//Array
Array (
    Array (
        //4 array elements from array one
        //1 array elements from array two
    )
    //...
)

最后,我们可以使用call_user_func_array()array_merge()组合在一起,将所有元素作为一维数组获取。

代码

<?php

    $array = array(1, 2, 3, 4, 5,6,7,8,9,10);
    $array2 = array(11, 12, 13, 14, 15 ,16,17,18,19,20);
    
    $result = call_user_func_array("array_merge", array_map(function($arrayOne, $arrayTwo){
        return array_merge(is_array($arrayOne) ? $arrayOne : [], is_array($arrayTwo) ? $arrayTwo : []);
    }, array_chunk($array, 4), array_chunk($array2, 1)));
    
    
    print_r($result);

?>

输出:

Array (
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 11
    [5] => 5
    [6] => 6
    [7] => 7
    [8] => 8
    [9] => 12
    [10] => 9
    [11] => 10
    [12] => 13
    [13] => 14
    [14] => 15
    [15] => 16
    [16] => 17
    [17] => 18
    [18] => 19
    [19] => 20
)

0
尝试创建一个第三个数组,并将另外两个数组的每一项推送到其中(使用您确定新项顺序的逻辑)。
<?php
    $array = array(1,2,3,4,5,6,7,8,9,10,21,22,23,24,25);
    $array2 = array(11, 12, 13, 14, 15 ,16,17,18,19,20);
    $array3=array();
    $temp=0;

    foreach ($array as $key => $item)
      {
        array_push($array3,$item);
        if(($key+1)%4=='0')
           {
               array_push($array3,$array2[$temp]);
               $temp++;
            } 
       }

     $count=count($array2);
     if($temp != $count)
         {
             for($a=$temp;$a<$count;$a++)
             {
                array_push($array3,$array2[$a]);
             } 
         }
    ?>

这将把$array3的内容设置为:

1, 2, 3, 4, 11, 5, 6, 7, 8, 12, 9, 10, 21, 22, 13, 23, 24, 25, 14, 15, 16, 17, 18, 19, 20

这是所有的array1,以四位数集合的形式交替出现,然后是array2的前3个元素,最后是array2的剩余元素。正如预期的那样。


正如 OP 所写的 但它没有显示 array2 的完整元素,我认为他希望在结果中获得来自 array2 的所有元素,只是在最后。我认为你应该能够通过使用一些更多的逻辑与 if 语句来修改你的代码,并检查其他数组是否仍然有元素,如果没有,就将这些元素推入。 - Rizier123

0
根据你的代码,循环将在到达第一个数组($array)的末尾时终止。如果第二个数组包含的元素数量超过第一个数组的1/4,则不会显示第二个数组的完整元素。

修改代码以打印出每个数组的剩余元素。

$array = array(1, 2, 3, 4, 5,6,7,8,9,10);
$array2 = array(11, 12, 13, 14, 15 ,16,17,18,19,20);

$temp = 0;
$length = count($array2);

foreach ($array as $key => $item){
    echo $item;
    if(($key+1)%4 == '0' && $temp < $length){
        echo $array2[$temp];
        $temp++;
    } 
}

// Print remaining elements if there are any
for ($i = $temp; $i < $length; $i++) {
    echo $array2[$i];
}

0

使用 issetarray_key_exists() 来检查数组索引是否存在并存储新的数组

$new = array();
foreach ($array as $key => $item)
{
    if(($key+1) % 4 == 0)
    {
        $new[] = $item;
        isset($array2[$temp]) ? $new[] = $array2[$temp] : "";//isset is check array index is exist in array 2
        $temp++;
    } 
    else{
        $new[] = $item;
    }
}

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