循环一会儿

时间:2010-04-20 22:19:48

标签: php loops nested while-loop

非常基本的问题..但我忽略了这一点......我的表上有这些数据:

ID SITEID SECTION
1  1      posts
2  2      posts
3  1      aboutme
4  1      contact
5  2      questions

输出是一个数组。我无法改变它。

我想在php上使用该数组的单个for循环来输出:

<h1> sections for site 1 </h1>
   posts
   aboutme
   contact

<h1>sections for site 2 </h1>
   posts
   questions

我正在尝试做这样的事情,其中​​$ sectionsArray是我的输出。我想检查siteid是否相同,然后进行循环..

for ($j = 0; $j < sizeof($sectionsArray); $j++) {
   while (siteid == 1) {
       echo '<h1>' . $sectionsArray['siteid'] . '</h1>';
   }
   echo "<a href='section.php?id=' . $sectionsArray['id'] . ' '">' . $sectionsArray['section'] . '</a>;
}

但我没有得到一段时间“分组”结果的逻辑...... INSIDE一个循环。欢迎任何光明。

谢谢

4 个答案:

答案 0 :(得分:1)

假设您无法更改查询,仅使用1个循环就无法实现此功能。当for循环遍历$sectionsArray时,您必须在遇到它时处理每一行。如果你只想要网站1的部分,你仍然会遇到网站2,3等的部分并不重要。要么忽略它们,要么处理它们。

如果您可以更改查询,请按SITEID订购,然后按ID订购。这将按站点对所有部分进行分组(注意:这与使用SQL GROUP BY语句不同)。

如果您无法更改查询,请使用for循环迭代$sectionsArray一次。在该循环中,构建第二个数组,其中不同的部分按站点ID排序。遍历第二个数组以输出现在处于站点id顺序的所有部分。

答案 1 :(得分:1)

又快又脏;)

<?php
$arr = array(
    array('id' => 1, 'site_id' => '1', 'section' => 'posts'),
    array('id' => 2, 'site_id' => '2', 'section' => 'posts'),
    array('id' => 3, 'site_id' => '1', 'section' => 'aboutme'),
    array('id' => 4, 'site_id' => '1', 'section' => 'contact'),
    array('id' => 5, 'site_id' => '2', 'section' => 'questions')
);

$htmlStrings = array();
$curr_site_id = '0';

foreach($arr as $item)
{
    if ( $item['site_id'] != $curr_site_id )
    {
        $curr_site_id = $item['site_id'];
        if ( !isset($htmlStrings[$curr_site_id]) ) $htmlStrings[$curr_site_id]['header'] = '<h' . $curr_site_id . '>Sections for site ' . $curr_site_id . '</h' . $curr_site_id . '>';
        $htmlStrings[$curr_site_id]['content'] .= '<br />' . $item['section'];
    }
    else
    {
        $htmlStrings[$curr_site_id]['content'] .= '<br />' . $item['section'];
    }
}

foreach($htmlStrings as $section)
{
    echo $section['header'];
    echo $section['content'];
}

答案 2 :(得分:0)

如果你想对数组进行一次传递,首先进行排序(从技术上讲,这也是一个传递!),然后在循环时检查siteid的变化。以下是在循环之前可以通过siteid对数组进行排序的方法:

$sections = array(
    array('id'=>1, 'siteid'=>1, 'section'=>'posts'),
    array('id'=>2, 'siteid'=>2, 'section'=>'posts'),
    array('id'=>3, 'siteid'=>1, 'section'=>'aboutme'),
    array('id'=>4, 'siteid'=>1, 'section'=>'contact'),
    array('id'=>5, 'siteid'=>2, 'section'=>'questions'),
);

usort($sections, 'sortBySiteId');

function sortBySiteId($a, $b)
{
    if ($a['siteid'] == $b['siteid']) {
        return 0;
    }
    return ($a['siteid'] < $b['siteid']) ? -1 : 1;
}

答案 3 :(得分:0)

谢谢..但我最终这样做了:

for ($j=0;$j<sizeof($sectionArray);$j++) {

 $section_id = $sectionArray[$j]['id'];
 $section_name = $sectionArray[$j]['secao'];

  echo '<div id="menu">';
  echo '<div class="section">'.$section_name.'</div>';

  $categoryArray = $objectCategory->listCategory($section_id); // return my array from db     

    for ($ii=0;$ii<sizeof($categoryArray);$ii++) {
        $categoryId = $categoryArray[$ii]['id'];
        $categoryName = $categoryArray[$ii]['category'];

        echo "<div class=\"item\">";
        echo "<a href=\"category.php?id=$categoryId\">$categoryName</a>";
        echo "</div>";  
    }
  echo '</div>';    
}   

可以吗?我的意思是,我对数组有一些问题...... :(

但无论如何,谢谢