[Помогите] Решить микро задачу по массиву

Тема в разделе "Wordpress", создана пользователем alex_storm, 10 июн 2015.

  1. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Есть форыч
    PHP:
    foreach( $pages as $k => $page ){
                    $pages_name = $page->post_title;
                    $pages_href = $page->guid;
                    $first_letter = get_first_letter( $page->post_title );
                    $prev_firstLetter = isset( $pages[ ($k-1) ] ) ? get_first_letter( $pages[ ($k-1) ]->post_title ) : '';
                ?>
                    <div class="inside-list">
                        <?php if( $prev_firstLetter !== $first_letter ){ ?>
                            <div class="heading"><h3><?php echo $first_letter?></h3><span id="<?php echo $first_letter?>"></span></div>
                        <?php ?>
                        <div class="list-link"><a href="<?php echo $pages_href?>"><?php echo $pages_name?></a></div>
                    </div>
                <?php ?>
    Сейчас он выводит значения с бд и добавляет алфавитный указатель.

    Выглядит это так
    HTML:
    <div class="inside">
            <div class="inside-list">
                <div class="heading"><h3>П</h3><span id="П"></span></div>
                <div class="list-link"><a href="?page_id=40">Пример страницы1</a></div>
            </div>
                <div class="inside-list">
                <div class="list-link"><a href="?page_id=2">Пример страницы2</a></div>
            </div>
            <div class="inside-list">
                <div class="heading"><h3>С</h3><span id="С"></span></div>
                <div class="list-link"><a href="?page_id=27">Страница 2</a></div>
            </div>
                <div class="inside-list">
                <div class="list-link"><a href="?page_id=29">Страница 3</a></div>
            </div>
                <div class="inside-list">
                <div class="list-link"><a href="?page_id=31">Страница 4</a></div>
            </div>
    </div>
    Вопрос, как код html превратить в следующий

    HTML:
    <div class="inside">
            <div class="inside-list">
                <div class="heading"><h3>П</h3><span id="П"></span></div>
                <div class="list-link"><a href="?page_id=40">Пример страницы1</a></div>
                <div class="list-link"><a href="?page_id=2">Пример страницы3</a></div>
                <div class="list-link"><a href="?page_id=2">Пример страницы4</a></div>
                <div class="list-link"><a href="?page_id=2">Пример страницы5</a></div>
                <div class="list-link"><a href="?page_id=2">Пример страницы6</a></div>
            <div class="inside-list">
                <div class="heading"><h3>С</h3><span id="С"></span></div>
                <div class="list-link"><a href="?page_id=27">Страница 2</a></div>
                <div class="list-link"><a href="?page_id=29">Страница 3</a></div>
                <div class="list-link"><a href="?page_id=31">Страница 4</a></div>
                <div class="list-link"><a href="?page_id=31">Страница 5</a></div>
                <div class="list-link"><a href="?page_id=31">Страница 6</a></div>
            </div>
    </div>
    В дальнейшем я хочу повесить деление на 3-4 колонки для блоков.
     
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    PHP:
    $pages_prepare = array();
    foreach( 
    $pages as $k => $page ){
         
    $first_letter get_first_letter$page->post_title );
         
    $pages_prepare[$first_letter][] = $page;
    }
    В результате получишь массив, где ключи - это буквы, а значения - массив страниц на эту букву. А его уже легко превратить в то, что тебе нужно.
     
  3. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Я так понял, приедется еще один форыч внутри этого делать
    Т.к. сейчас выдает <b>Warning</b>: Illegal string offset 'B'
    <div class="list-link"><a href="<?php echo $pages_href[$first_letter]; ?>"><?php echo $pages_name[$first_letter]; ?></a></div>

    Это я попробовал по ключу обратися
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Да. Что-то типа:
    PHP:
    foreach($pages_prepare as $first_letter => $pages){
        echo 
    "<div class=\"inside-list\">
                <div class=\"heading\"><h3>
    $first_letter</h3><span id=\"$first_letter\"></span></div>";
            foreach(
    $pages as $page){
                
    $pages_name $page->post_title;
                
    $pages_href $page->guid;
                echo 
    "<div class=\"list-link\"><a href=\"$pages_href\"> $pages_name</a></div>";   
            }
        echo 
    "</div>";
    }
     
  5. alex_storm

    alex_storm webdev

    Регистрация:
    11 дек 2012
    Сообщения:
    1.151
    Симпатии:
    667
    Сделал форычь
    PHP:
      <div class="inside">
         <?php
           $pages
    get_pages('orderby=title&posts_per_page=10&parent=0');
           foreach(
    $pages as $first_letter => $page){   
             
    $first_letter get_first_letter$page->post_title );
             
    $prev_firstLetter = isset( $pages[ ($first_letter-1) ] ) ? get_first_letter$pages[ ($first_letter-1) ]->post_title ) : '';
           
    ?>
           <div class="inside-list">
             <?php if($prev_firstLetter != $first_letter){ ?>
               <div class="heading"><h3><?php echo $first_letter?></h3><span id="<?php echo $first_letter?>"></span></div>
             <?php ?>
             <?php
               
    foreach($pages as $page){
                 
    $pages_name $page->post_title;
                 
    $pages_href $page->guid;
             
    ?>
               <div class="list-link"><a href="<?php echo $pages_href?>"><?php echo $pages_name?></a></div>
             <?php ?>
           </div>
         <?php ?>
       </div>
    Получил результат почти такой, как надо, правда в каждую при прохождении интерации пишет несколько одинаковых букв и внутри повторяются страницы.
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Мне кажется, дело в том, что ты каждый раз первую букву отдельно обрабатываешь.
    В моём варианте все страницы сначала сортируются по буквам и повторение букв в принципе невозможно.

    Кстати, а как работает вот это:
    PHP:
    $first_letter-1