循环到一个多维数组并构建一个包含rowspan的表

时间:2018-01-04 15:05:57

标签: php arrays

我有这个数组:

Array
(
    [France] => Array
        (
            [0] => Array
                (
                    [city] => Paris
                )
        )
    [Canada] => Array
        (
            [0] => Array
                (
                    [city] => Montreal
                )

            [1] => Array
                (
                    [city] => Ottawa
                )
        )
)

有时候,就像你可以看到一个国家可以有一个城市(法国的情况)但有时这个国家可以有一个以上的城市(加拿大的情况)。

我希望得到最终结果:

<table>
    <thead>
        <tr>
            <th>Country</th>
            <th>Cities</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td rowspan="1">France</td>
            <td>Paris</td>
        </tr>
        <tr>
            <td rowspan="2">Canada</td>
            <td>Montreal</td>
        </tr>
        <tr>
            <td>Toronto</td>
        </tr>
    </tbody>
</table>

这是我实际拥有的东西:

foreach($countries as $country => $city) {
    $count = count($country) ;

    if($count == 1) {
        echo '
            <tr>
                <td rowspan="1">'.$country.'</td>
                <td>'.$city.'</td>
            </tr>
        '
    }
    else {
        echo '
            <tr>
                <td rowspan="'.$count.'">'.$country.'</td>
                <td>'.$city.'</td>
            </tr>
            <tr>
                <td>'.$city.'</td>
            </tr>
        '
    }      
}

我的问题是循环以及如何打印城市。

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

因为您要为每个城市创建一行,所以您必须遍历每个城市。确定rowspan值以及是否在同一行显示第一个城市只是基于它是否是该国家城市的第一次迭代。

因此,以下代码将产生您想要的结果:

<?php
$array = [
    'France' => [
        [
            'city' => 'Paris'    
        ]    
    ], 
    'Canada' => [
        [
            'city' => 'Montreal'    
        ], [
            'city' => 'Ottawa'    
        ],
    ],
];
?>
<table>
    <thead>
        <tr>
            <th>Country</th>
            <th>Cities</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($array as $country => $city): ?>
        <?php foreach (array_values($city) as $i => $value): ?>
        <tr>
            <?php if ($i === 0): ?>
            <td rowspan="<?= count($city) ?>"><?= $country ?></td>
            <?php endif ?>
            <td><?= $value['city'] ?></td>
        </tr>
        <?php endforeach ?>
        <?php endforeach ?>
    </tbody>
</table>

https://3v4l.org/vp2bl

结果:

<table>
    <thead>
        <tr>
            <th>Country</th>
            <th>Cities</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td rowspan="1">France</td>
            <td>Paris</td>
        </tr>
        <tr>
            <td rowspan="2">Canada</td>
            <td>Montreal</td>
        </tr>
        <tr>
            <td>Ottawa</td>
        </tr>
    </tbody>
</table>

答案 1 :(得分:0)

对于rawspan,你必须检查城市的数量而不是国家的数量。 你必须使用两个foreach one to country和one to city。 下面的代码是用php7编写的,对于使用[]的数组。如果您使用的是php 5.6,请将数组定义用作array()。

    <table>
    <thead>
        <tr>
            <th>Country</th>
            <th>Cities</th>
        </tr>
    </thead>
    <tbody>
        <?php $array =  ['france' => ['paris'], 'canada' => ['montreal', 'ottawa']]; ?>
        <?php foreach ($array as $country => $cities) { ?>
            <tr>
                <td rowspan="<?php echo (count($cities)) ?>"><?php echo $country ?></td>
                <?php foreach ($cities as $index => $city) { ?>
                    <?php if ($index === 0) { ?>
                        <td><?php echo $city ?> </td></tr>
                <?php } else { ?>
                    <tr>
                        <td><?php echo $city ?></td>
                    </tr>
                <?php } ?>
            <?php } ?>
        <?php } ?>
    </tbody>
</table>

答案 2 :(得分:0)

<thead>
    <tr>
        <th>Country</th>
        <th>Cities</th>
    </tr>
</thead>
<tbody>
    <?php $array = ['France' => [['city' => 'Paris']], 'Canada' => [['city' => 'Montreal'], ['city' => 'Ottawa']]]; ?>
    <?php foreach ($array as $country => $cities) { ?>
        <tr>
            <td rowspan="<?php echo (count($cities)) ?>"><?php echo $country ?></td>
            <?php foreach (array_values($cities) as $index => $value) { ?>
                <?php if ($index === 0) { ?>
                    <td><?php echo $value['city'] ?> </td></tr>
            <?php } else { ?>
                <tr>
                    <td><?php echo $value['city'] ?></td>
                </tr>
            <?php } ?>
        <?php } ?>
    <?php } ?>
</tbody>

答案 3 :(得分:-1)

试试这个。它应该工作正常

 <?php
$france = array();
$canada = array();
$city1 = array('city'=>'Paris');
$city2 = array('city'=>'Montreal');
$city3 = array('city'=>'Ottawa');
array_push($france,$city1);
array_push($canada,$city2);
array_push($canada,$city3);
$country = array('France'=>$france,'Canada'=>$canada);
<table border="1" cellpadding="5" cellspacing="0">
<thead>
<th>Country </th><th> City </th>
</thead>
<tbody><?php
$flag=0;
foreach($country as $cN=>$city):?>
<tr><td rowspan="<?php echo count($city);?>"> <?php echo $cN;?></td> 
<?php
    if(count($city)>1)
    {
            foreach($city as $ckey=>$name):
            if($flag)
            {
            ?>
            <tr><td> <?php  echo $name['city'];?></td></tr><?php
            }
            else
            {?>
                <td> <?php  echo $name['city'];?></td><?php
            }
            $flag = 1;
            endforeach; 
    }
    else
    {
        foreach($city as $ckey=>$name):?>
        <td> <?php  echo $name['city'];?></td><?php
        endforeach; 
    }
?></tr><?php
endforeach;
?></tbody></table>