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

yiytaume  于 2023-05-27  发布在  PHP
关注(0)|答案(5)|浏览(158)

这里是数组

$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

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

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

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

moiiocjp

moiiocjp1#

棘手的部分是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>

算法:

  • 我们将此表视为两行。
  • 因此,第一行将有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,它会在E下面添加一个td,并与其他值一起依此类推。
brgchamk

brgchamk2#

这不是确切的解决方案,但它将确切的逻辑,您可以在您的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,GEB,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++;
}
laawzig2

laawzig23#

我觉得你应该

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

e1xvtsh3

e1xvtsh34#

<?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循环一样。我不知道你为什么要使用foreach-loop。for循环似乎对此更好。switch-case可以使它更具可读性,你可以评论你的案例。

9jyewag0

9jyewag05#

我很欣赏@nice_dev使用HTML和rowspan来满足所需的设计布局。我想推荐一个替代的代码片段来生成相同的标记。
我的代码片段使用多维数组来构建/保留两行表格单元格。然后循环数组以显示表行。
代码:(Demo

$array = range('A', 'L');

$tdsByRow = [];
foreach ($array as $i => $v) {
    switch ($i % 3) {
        case 0:
            $tdsByRow[0][] = '<td rowspan="2">' . $v . '</td>';
            break;
        case 1:
            $tdsByRow[0][] = '<td>' . $v . '</td>';
            break;
        case 2:
            $tdsByRow[1][] = '<td>' . $v . '</td>';
            break;
     }
}

if ($tdsByRow) {
    echo '<table border="1">';
        foreach ($tdsByRow as $tds) {
            echo "<tr>" . implode($tds) . "</tr>";
        }
    echo "</table>";
}

相关问题