【问题标题】:merge and reorder 3 arrays合并和重新排序 3 个数组
【发布时间】:2016-04-21 18:08:38
【问题描述】:

我不知道如何命名,也不知道该怎么做:

<?php
    $a = ['a1','a2','a3','a4']; // and more a5 … a42
    $b = ['b1','b2','b3','b4'];
    $c = ['c1','c2','c3','c4'];

// want

$full = ['a1','b1','c1',
         'c2','a2','b2',
         'b3','c3','a3',
         'a4','b4','c4'];

print_r($full);

就像 a,b,c,a,b,c,a,b,c,a,b,c,a 和解决方案是一个数学系列?

【问题讨论】:

  • 它叫做转置
  • @PraveenKumar 仔细看,它并不完全像骗子。只需查看所需输出的第二行。我第一眼也没看到。
  • @Rizier123 好的...它看起来像转置和连接。
  • 有人可以对这个问题的规则添加一个合乎逻辑的解释吗?为什么c2是结果数组第二行的第一个元素?

标签: php arrays algorithm logic


【解决方案1】:

需要合并所有数组,请通过此PHP代码。

$a = array('a1','a2','a3','a4'); // and more a5 … a42
$b = array('b1','b2','b3','b4');
$c = array('c1','c2','c3','c4');    
$d = array_merge($a,$b,$c); 
echo mathseries($d,3);

function mathseries($d=array(),$break_number) {
    $f =  count($d) / $break_number;
    for($i=0;$i<$f;$i++) {
        $r[] = $d[$i].','.$d[$i+$f].','.$d[$i+($f*2)];
    }
    $r = implode(',',$r);
    return $r;
}

创建一个函数,其中发送两个参数,第一个参数数组。第二个参数是断点。

【讨论】:

    【解决方案2】:
     $arr = [$a, $b, $c];    
     $full = [];
     $i = 0;
     $k = 0;
    for ($j = 0; $j < count($a); $j++)
       do {
         $full[] = $arr[$k][$j];
         $i = ++$i % 3;
         if ($i) $k = ++$k % 3;
         } while ($i);
     print_r($full);   
    

    demo

    【讨论】:

    • 这个答案缺少教育解释。
    【解决方案3】:

    首先我们创建一个包含三个原始数组的多维数组,然后通过两个嵌套的for 循环填充目标$result

    $all    = [ $a, $b, $c ];
    $result = [];
    for( $i=0; $i<count( $a ); $i++ )
    {
        for( $j=0; $j<count( $all ); $j++ )
        {
            $result[] = $all[ 3*(($i+$j*2)%3>0)-(($i+$j*2)%3) ][ $i ];
        }
    }
    

    eval.in demo

    要填充$result,第二个键[$i]是每个原始数组的渐进索引(0、1、2、...);要创建第一个密钥,我们使用此算法:

     3 * ( ($i + $j * 2 ) % 3 > 0 ) - ( ( $i + $j * 2 ) % 3 )       $i  $j
     --------------------------------------------------------
     3 * ( ( 0 +  0 * 2 ) % 3 > 0 ) - ( (  0 +  0 * 2 ) % 3 )        0   0
     3 * ( (          0 ) % 3 > 0 ) - ( (           0 ) % 3 )      
     3 * (                      0 ) - (                   0 ) =  0
    
     3 * ( ( 0 +  1 * 2 ) % 3 > 0 ) - ( (  0 +  1 * 2 ) % 3 )        0   1
     3 * ( (          2 ) % 3 > 0 ) - ( (           2 ) % 3 )      
     3 * (                      1 ) - (                   2 ) =  1
    
     3 * ( ( 0 +  2 * 2 ) % 3 > 0 ) - ( (  0 +  2 * 2 ) % 3 )        0   2
     3 * ( (          4 ) % 3 > 0 ) - ( (           4 ) % 3 )      
     3 * (                      1 ) - (                   1 ) =  2
     --------------------------------------------------------
     3 * ( ( 1 +  0 * 2 ) % 3 > 0 ) - ( (  1 +  0 * 2 ) % 3 )        1   0
     3 * ( (          1 ) % 3 > 0 ) - ( (           1 ) % 3 )      
     3 * (                      1 ) - (                   1 ) =  2
    
     3 * ( ( 1 +  1 * 2 ) % 3 > 0 ) - ( (  1 +  1 * 2 ) % 3 )        1   1
     3 * ( (          3 ) % 3 > 0 ) - ( (           3 ) % 3 )      
     3 * (                      0 ) - (                   0 ) =  0
    
     3 * ( ( 1 +  2 * 2 ) % 3 > 0 ) - ( (  1 +  2 * 2 ) % 3 )        1   2
     3 * ( (          5 ) % 3 > 0 ) - ( (           5 ) % 3 )      
     3 * (                      1 ) - (                   2 ) =  1
     --------------------------------------------------------
     3 * ( ( 2 +  0 * 2 ) % 3 > 0 ) - ( (  2 +  0 * 2 ) % 3 )        2   0
     3 * ( (          2 ) % 3 > 0 ) - ( (           2 ) % 3 )      
     3 * (                      1 ) - (                   2 ) =  1
    
     3 * ( ( 2 +  1 * 2 ) % 3 > 0 ) - ( (  2 +  1 * 2 ) % 3 )        2   1
     3 * ( (          4 ) % 3 > 0 ) - ( (           4 ) % 3 )      
     3 * (                      1 ) - (                   1 ) =  2
    
     3 * ( ( 2 +  2 * 2 ) % 3 > 0 ) - ( (  2 +  2 * 2 ) % 3 )        2   2
     3 * ( (          6 ) % 3 > 0 ) - ( (           6 ) % 3 )      
     3 * (                      0 ) - (                   0 ) =  0
     --------------------------------------------------------
     3 * ( ( 3 +  0 * 2 ) % 3 > 0 ) - ( (  3 +  0 * 2 ) % 3 )        3   0
     3 * ( (          3 ) % 3 > 0 ) - ( (           3 ) % 3 )      
     3 * (                      0 ) - (                   0 ) =  0
    
     3 * ( ( 3 +  1 * 2 ) % 3 > 0 ) - ( (  3 +  1 * 2 ) % 3 )        3   1
     3 * ( (          5 ) % 3 > 0 ) - ( (           5 ) % 3 )      
     3 * (                      1 ) - (                   2 ) =  1
    
     3 * ( ( 3 +  2 * 2 ) % 3 > 0 ) - ( (  3 +  2 * 2 ) % 3 )        3   2
     3 * ( (          7 ) % 3 > 0 ) - ( (           7 ) % 3 )      
     3 * (                      1 ) - (                   1 ) =  2
     --------------------------------------------------------
     (...)
    

    【讨论】:

    • 仅供参考,您的演示链接不再加载
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多