【问题标题】:PHP - Take 4 items from one array then 2 from another and merge into an array, recurse until no more itemsPHP - 从一个数组中取出 4 个项目,然后从另一个数组中取出 2 个并合并到一个数组中,递归直到没有更多项目
【发布时间】:2015-07-20 19:57:49
【问题描述】:

我有 2 个数组,一个是横向图像 url,一个是纵向图像 url。它们最终会以图片幻灯片的形式输出到页面上,每张幻灯片由 4 张横向图片和 2 张纵向图片组成。

我已经将图像放入它们的数组中,我正在调用它们

$horizontalImages
$verticalImages

现在我想创建一个新数组,从 $horizontalImages 中选择前 4 张图像,从 $verticalImages 中选择前 2 张图像,并在新数组中创建一个条目。然后递归地从$horizontalImages 中选择下一个 4,从$verticalImages 中选择下一个 2,并在新数组中创建下一项并继续直到没有更多项为止。

所以,我认为数据应该是什么样子的天上掉馅饼示例将类似于以下内容,请原谅这里的错误,我正在根据可能的样子进行调整,但我不能甚至告诉这是否正确或者它是否是多维/嵌套数组,所以很明显我需要帮助理解这个新数组的结构的原理。

array(x) {
    [0]=>???Array???(x){
       [0]=>"/landscape-image-1.jpg"
       [1]=>"/landscape-image-2.jpg"
       [2]=>"/landscape-image-3.jpg"
       [3]=>"/landscape-image-4.jpg"
       [4]=>"/portrait-image-1.jpg"
       [5]=>"/portrait-image-2.jpg"
    }
    [1]=>???Array???(x){
       [0]=>"/landscape-image-5.jpg"
       [1]=>"/landscape-image-6.jpg"
       [2]=>"/landscape-image-7.jpg"
       [3]=>"/landscape-image-8.jpg"
       [4]=>"/portrait-image-3.jpg"
       [5]=>"/portrait-image-4.jpg"
    }
}

一旦我以真正有效的方式锁定了阵列,我想通过foreach 循环将其放入:

foreach ($myArray as $slide):
$image1 = $slide['0'];
$image2 = $slide['1'];
$image3 = $slide['2'];
$image4 = $slide['3'];
$image5 = $slide['4'];
$image6 = $slide['5'];

// Blah blah HTML output, so on so forth...

endforeach;

我希望我已经提供了足够的信息。在此先感谢您的帮助。

这是我尝试过的东西,似乎有点工作......但我得到了重复等等。

$countH = 0;
$countV = 0;

foreach ($horizontalImages as $key => $horizImg):

    $countH++;

       foreach ($verticalImages as $k =>$vertImg):

                    $countV++;

                    if ($countH % 4 == 1):

             $variables[$countH][] = $horizImg; 

                            if ($countV % 2 == 1):
                                $variables[$countH][] = $vertImg; 
                            endif;

                    endif;

       endforeach;
    endforeach;



    <pre>
    <?php var_dump($variables); ?>
    </pre>

结果为

    array(5) {
  [1]=>
  array(12) {
    [0]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [1]=>
    string(54) "/files/cache/f5e4eeec3e2e0a7fcaefdc1c756cdee8_f486.jpg"
    [2]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [3]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [4]=>
    string(54) "/files/cache/08cbd2856e4ecb8f25347540238ff356_f488.jpg"
    [5]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [6]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [7]=>
    string(54) "/files/cache/67c4cb481a31c03626b7289e66515f93_f489.jpg"
    [8]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [9]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
    [10]=>
    string(54) "/files/cache/046cb32b0c062a359a71e24e814d5bff_f485.jpg"
    [11]=>
    string(54) "/files/cache/ff89e524684c8ff50103fefd715e6f46_f473.jpg"
  }
  [5]=>
  array(12) {
    [0]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [1]=>
    string(54) "/files/cache/f5e4eeec3e2e0a7fcaefdc1c756cdee8_f486.jpg"
    [2]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [3]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [4]=>
    string(54) "/files/cache/08cbd2856e4ecb8f25347540238ff356_f488.jpg"
    [5]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [6]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [7]=>
    string(54) "/files/cache/67c4cb481a31c03626b7289e66515f93_f489.jpg"
    [8]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [9]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
    [10]=>
    string(54) "/files/cache/046cb32b0c062a359a71e24e814d5bff_f485.jpg"
    [11]=>
    string(54) "/files/cache/40a132f198f0648b4b9794505d8a7201_f474.jpg"
  }
  [9]=>
  array(12) {
    [0]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [1]=>
    string(54) "/files/cache/f5e4eeec3e2e0a7fcaefdc1c756cdee8_f486.jpg"
    [2]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [3]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [4]=>
    string(54) "/files/cache/08cbd2856e4ecb8f25347540238ff356_f488.jpg"
    [5]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [6]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [7]=>
    string(54) "/files/cache/67c4cb481a31c03626b7289e66515f93_f489.jpg"
    [8]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [9]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
    [10]=>
    string(54) "/files/cache/046cb32b0c062a359a71e24e814d5bff_f485.jpg"
    [11]=>
    string(54) "/files/cache/c96f867163ec38d83d59350dfdb9518d_f478.jpg"
  }
  [13]=>
  array(12) {
    [0]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [1]=>
    string(54) "/files/cache/f5e4eeec3e2e0a7fcaefdc1c756cdee8_f486.jpg"
    [2]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [3]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [4]=>
    string(54) "/files/cache/08cbd2856e4ecb8f25347540238ff356_f488.jpg"
    [5]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [6]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [7]=>
    string(54) "/files/cache/67c4cb481a31c03626b7289e66515f93_f489.jpg"
    [8]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [9]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
    [10]=>
    string(54) "/files/cache/046cb32b0c062a359a71e24e814d5bff_f485.jpg"
    [11]=>
    string(54) "/files/cache/c09af0f66cb15621163e4018e4c34e72_f479.jpg"
  }
  [17]=>
  array(12) {
    [0]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [1]=>
    string(54) "/files/cache/f5e4eeec3e2e0a7fcaefdc1c756cdee8_f486.jpg"
    [2]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [3]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [4]=>
    string(54) "/files/cache/08cbd2856e4ecb8f25347540238ff356_f488.jpg"
    [5]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [6]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [7]=>
    string(54) "/files/cache/67c4cb481a31c03626b7289e66515f93_f489.jpg"
    [8]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [9]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
    [10]=>
    string(54) "/files/cache/046cb32b0c062a359a71e24e814d5bff_f485.jpg"
    [11]=>
    string(54) "/files/cache/ba56c501e8f83264894d84a53ce056d1_f467.jpg"
  }
}

【问题讨论】:

  • 你试过什么?听起来像是一些巧妙的数学运算,while looping 可以完成这项工作。
  • 你知道我做了一点,主要是我创建了两个数组来存储风景和肖像图像,然后我的大脑完全崩溃了,试图想象我如何将它们混合在一起。我没有考虑使用while,但我想我可以使用 4 和 2 的倍数,但实际上是将它合并到一个数组中让我很难过……除非我不必这样做?

标签: php arrays recursion multidimensional-array


【解决方案1】:
$ch = ceil(count($horizontalImages) / 4);// Count of quartet (including incomplete tuples)
$cv = ceil(count($verticalImages) / 2);// Count of doublet (including incomplete tuples)

$c = $ch>$cv ? $ch : $cv; // Are there more - quartets or doublets?    
$out = array();

// We pass on the long side
for ($x=0;$x<$c;$x++) {
    $tmp1 = $x<$ch ? array_slice($horizontalImages, $x*4, 4) : array(); // No more quartet?
    $tmp2 = $x<$cv ? array_slice($verticalImages, $x*2, 2) : array(); // No more doublet?
    $out[] = array_merge( $tmp1, $tmp2 ); // Fold tuples together
}

http://ideone.com/2xaO2q

【讨论】:

  • 当...这对array_slice 来说真的很棒。非常感谢,比我想出的任何东西都要聪明。
猜你喜欢
  • 2021-12-26
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2012-11-12
  • 2017-07-06
相关资源
最近更新 更多