将Foreach数组拆分为奇数和偶数

时间:2018-12-29 07:24:00

标签: php html foreach

这是数组

    $array = [
a=>["name"= "name1", "id"="1"..], 
b=>["name"= "name2", "id"="2"..], 
c=>["name"= "name3", "id"="3"..],
d=>["name"= "name4", "id"="4"..],
e=>["name"= "name5", "id"="5"..], 
f=>["name"= "name6", "id"="6"..],......);

我想要实现的是 foreach循环可回显此类项目

Design

Image Link

这是我所做的,但没有运气

$len = count($moduleTypes); 
$firsthalf = array_slice($moduleTypes, 0, $len / 2);
$secondhalf = array_slice($moduleTypes, $len / 2);

中断数组并分别回显每个数组, Foreach循环必须继续,但是在第二次迭代中,它需要循环两次[B,C],下一次迭代一次[D],依此类推..检查图像的视角

4 个答案:

答案 0 :(得分:1)

这不是确切的解决方案,但会精确到可以在html代码中实现的逻辑

<?php

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

$counter = 1;
$temp = "";
foreach($array as $val){

    if($temp == 1){
        echo "E$val<br>";
        $temp=0;
        $counter++;
    }else{
        if($counter % 2 == 0){
            echo "E$val<br>";

            $temp = 1;
        }else{
            echo "O$val<br>";
        }
    }

    $counter++;

}

O / p赞

O1
E2
E3
O4
E5
E6
O7

OA,D,G的地方 而EB,C,E,F

更新

foreach($array as $key => $val){

    if($temp == 1){
        echo "E".$val['name']."<br>";
        $temp=0;
        $counter++;
    }else{
        if($counter % 2 == 0){
            echo "E".$val['name']."<br>";

            $temp = 1;
        }else{
            echo "O".$val['name']."<br>";
        }
    }
    $counter++;
}

答案 1 :(得分:1)

我认为这就是你需要的

for ($i = 1; $i <= count($array); $i = $i + 3) {

echo '<br>';
echo '-' . $array[$i-1] . '-';
if (!isset($array[$i])) break;
echo '<br>';
echo $array[$i] . ' ';
if (!isset($array[$i+1])) break;
echo $array[$i+1];

}

您可以在这里http://sandbox.onlinephpfunctions.com/code/b3fba97df75b235b1acccacf82b800e21f3924f5

答案 2 :(得分:0)

<?php
$array = [
"a"=>["name"=> "name1", "id"=>"1"], 
"b"=>["name"=> "name2", "id"=>"2"], 
"c"=>["name"=> "name3", "id"=>"3"],
"d"=>["name"=> "name4", "id"=>"4"],
"e"=>["name"=> "name5", "id"=>"5"],
"f"=>["name"=> "name6", "id"=>"6"]
];

$keys = array_keys($array);

foreach(array_keys($array) as $i => $key) {
    switch($i % 3) {
        case 2: // case: 3rd values
            continue;
        break;
        case 1: // case: 2nd values
            $nextkey = $keys[$i + 1];
            // show $key and $nextkey
            print_r($array[$key]);
            if( $array[$nextkey] ) {
                print_r($array[$nextkey]);
            }
            echo "---\r\n"; // delimiter
        break;
        default:
            // case: very first and every 4th values
            print_r($array[$key]);
            echo "---\r\n"; // delimiter
    }

}

您可以使用array_keys,然后像使用for循环一样使用index-value。我不知道您为什么要使用foreach循环。 For循环似乎对此更好。 switch-case可以使其更具可读性,您可以对案件进行评论。

答案 3 :(得分:0)

棘手的部分是HTML表。恭喜我成功nerd sniping

<?php

$arr = ['A','B','C','D','E','F','G','H','I','J','K','L'];

$second_row = [];
$first_row_next = 1;

echo "<table border='1'>";
echo "<tr>";

for($i=0;$i<count($arr);$i++){
  if($i%3 == 0){
    echo "<td rowspan='2'>$arr[$i]</td>"; // belongs to the first row with rowspan
  }else if($i == $first_row_next){
    echo "<td>$arr[$i]</td>";// belongs to first row with no rowspan since it's other subordinate will come down under it.
    $first_row_next += 3;
  }else{
    $second_row[] = $arr[$i];
  }
}

echo "</tr>";
echo "<tr><td>".implode("</td><td>",$second_row)."</td></tr>";
echo "</table>";

输出:

它生成以下HTML表:

<table border='1'>
  <tr>
    <td rowspan='2'>A</td>
    <td>B</td>
    <td rowspan='2'>D</td>
    <td>E</td>
    <td rowspan='2'>G</td>
    <td>H</td>
    <td rowspan='2'>J</td>
    <td>K</td>
  </tr>
  <tr>
    <td>C</td>
    <td>F</td>
    <td>I</td>
    <td>L</td>
  </tr>
</table>

算法:

  • 我们将此表视为2行。
  • 因此,第一行将包含ABDEGHJK
  • 第二行包含CFIL
  • 如果查看数组索引,则索引0、3、6、9 ...的每个值在表中的行距为2。因此,第一个条件是:if($i%3 == 0)
  • 对于第一行的值,其下还有其他下属,其索引遵循1,4,7,10 ...等,没有行跨度。 $first_row_next对其进行跟踪,并相应地输出td数据。
  • 对于第二行,任何不满足上述要求的数组索引均位于第二行之下。因此,我们将它们收集在第二个数组中,最后输出第二行。

HTML表的工作方式

第一行是:

<tr>
    <td rowspan='2'>A</td>
    <td>B</td>
    <td rowspan='2'>D</td>
    <td>E</td>
    <td rowspan='2'>G</td>
    <td>H</td>
    <td rowspan='2'>J</td>
    <td>K</td>
</tr>

这将生成第一行。到目前为止,一切都很好。 第二行是:

<tr>
    <td>C</td>
    <td>F</td>
    <td>I</td>
    <td>L</td>
</tr>

呈现方式是:

  • 表中共有2行。
  • 要渲染C时,它将在A中寻找空间,但没有得到空间,因此移至下一列。它进入B,因此被附加。
  • 对于F,它找到一个td的空间,该空间要添加到E的下面,依此类推。