第n项

时间:2015-08-27 15:19:45

标签: php

说我有一个数组,

array('one','two','three','four','five','six','seven','eight','nine','ten');

我想订购每一件物品,以便我现在得到:

array('one','five','nine','two','six','ten','three','seven','x','four','eight','x');

基本上,最终目标是使用浮动从上到下而不是从左到右排列。我知道其他方法(放弃IE9--,使用SCSS或使用javascript)。除了丢失旧的IE 9支持外,使用PHP是最低的资源,所以让我们只关注PHP。

现在,我可以看到我需要将原始数组填充到3的倍数,但我想不出一种方法来获得我需要的排序而没有三个嵌套循环和模数表达式。

数组值是占位符,所以不要挂断它们。

4 个答案:

答案 0 :(得分:1)

这是一个解决方案,输出位于$output

// Input
$data = array('one','two','three','four','five','six','seven','eight','nine','ten');
$groups = 3;

// Calculations
$num_per_group = ceil(count($data) / $groups);
$final_size = $groups * $num_per_group;         // Multiple of $groups
$data = array_pad($data, $final_size, "x");     // Pad to $final_size

$output = array();
for ($i = 0; $i < $num_per_group; $i++) {       // Outer loop, by # per group
    for ($j = 0; $j < $groups; $j++) {          // Inner loop, by # of groups
        $output[] = $data[$j * $num_per_group + $i];
    }
}

输出:

php > var_dump($output);
array(12) {
  [0]=>
  string(3) "one"
  [1]=>
  string(4) "five"
  [2]=>
  string(4) "nine"
  [3]=>
  string(3) "two"
  [4]=>
  string(3) "six"
  [5]=>
  string(3) "ten"
  [6]=>
  string(5) "three"
  [7]=>
  string(5) "seven"
  [8]=>
  string(1) "x"
  [9]=>
  string(4) "four"
  [10]=>
  string(5) "eight"
  [11]=>
  string(1) "x"
}

答案 1 :(得分:0)

$a = array('one','two','three','four','five','six','seven','eight','nine','ten');

// prepare
$n = 0;                 // counter
$x = array();           // storage
$f = ceil(count($a)/3); // we need a number of arrays so that each 
                        // one has to hold no more than three entries

// distribute
foreach ($a as $entry) {
    $i = $n++ % $f;     // calculate into which array to drop the entry
    $x[$i][] = $entry;  // drop it
}

// collect it
$z = array();
for ($i = 0; $i<$f; $i++) {
        if (count($x[$i])<count($x[0])) $x[$i][] = 'x'; // pad it if too short
        $z = array_merge($z, $x[$i]);
}

$a包含输入和$z输出字符串。

答案 2 :(得分:0)

您不需要对数组进行排序。我有时会这样解决它:

$col  = 0;
$cols = 3;

foreach($array as $number){

 $col++;
 if($col == 1){
  echo '<tr>'
 }

 echo '<td>'.$number.'</td>';

 if($col == $cols){
  echo '</tr>'
  $col = 0;
 }

}

进展:你只需要一个循环就可以在cols amd行之间输出你喜欢的所有代码。

答案 3 :(得分:0)

在一个简洁的函数中只使用一个循环的更精确的解决方案:

function pad_and_transpose_columns($data, $groups) {
    $num_per_group = ceil(count($data) / $groups);
    $final_size = $groups * $num_per_group;         // Multiple of $groups
    $data = array_pad($data, $final_size, "x");     // Pad to $final_size

    $output = array();
    for ($i = 0; $i < $final_size; $i++) {
        $output[] = $data[($i * $num_per_group + floor($i / $groups)) % 12];
    }
    return $output;
}

$data = array('one','two','three','four','five','six','seven','eight','nine','ten');
$output = pad_and_transpose_columns($data, 3);
// array('one','five','nine','two','six','ten','three','seven','x','four','eight','x');