Петля с некоторое время - PullRequest
       26

Петля с некоторое время

0 голосов
/ 21 апреля 2010

Очень простой вопрос .. но я упускаю суть .. У меня есть эти данные на моей таблице:

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

Я пытаюсь сделать что-то вроде этого, где $ sectionArray - это мой вывод. И я хочу проверить, совпадает ли 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>;
}

Но я не понимаю логику "группировки" результатов за какое-то время ... ВНУТРИ цикла. Любой свет будет приветствоваться.

Спасибо

Ответы [ 4 ]

1 голос
/ 21 апреля 2010

Быстро и грязно;)

<?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'];
}
1 голос
/ 21 апреля 2010

Вы не можете сделать это с помощью всего одного цикла, предполагая, что вы не можете изменить запрос. Когда вы for перебираете $sectionsArray, вам приходится иметь дело с каждой строкой, когда вы сталкиваетесь с ней. Неважно, хотите ли вы только разделы для сайта 1, вы по-прежнему будете сталкиваться с разделами для сайта 2, 3 и т. Д. И либо игнорировать их, либо иметь дело с ними.

Если вы можете изменить свой запрос, сделайте заказ на SITEID, затем ID. Это сгруппирует все разделы по сайту (примечание: это не то же самое, что использование оператора SQL GROUP BY).

Если вы не можете изменить свой запрос, используйте цикл for, чтобы выполнить итерацию по $sectionsArray один раз. В этом цикле создайте второй массив с различными разделами, упорядоченными по идентификатору сайта. Выполните итерацию по этому второму массиву, чтобы вывести все разделы, которые теперь расположены в порядке идентификатора сайта.

0 голосов
/ 24 апреля 2010

спасибо .. но в итоге я сделал это:

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>';    
}   

Это нормально? Я имею в виду, у меня есть некоторые проблемы с массивами ...: (

Но все равно спасибо

0 голосов
/ 21 апреля 2010

Если вы хотите сделать один проход в массиве, сначала сортируйте (технически, это тоже проход!), А затем проверяйте изменения в 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;
}
...