2015-11-14 3 views
0

Я пытаюсь добавить first и last класс в некоторые элементы LI, и у меня возникла проблема с первым индексом. Код, где у меня есть вопрос здесь:Проблема с выпуском PHP foreach с первым элементом

// this is always true, and all items get the `first` class 
if ($i == 0) { $menu_item_class .= ' first'; } 

Весь код выглядит следующим образом:

function social_icons($menu_item_class='', $icon_class='', $title_class = ''){ 
    $menu_item_class .= ($title_class != '') ? ' no-title' : ''; 
    $social_network = array(
    0=> array (
     "title"=> "ello", 
     "url"=>"envato" 
    ), 
    1=> array (
     "title"=> "vk", 
     "url"=> "envato" 
    ), 
    2=> array (
     "title"=> "twitter", 
     "url"=> "envato" 
    ), 
    3=> array (
     "title"=> "lastfm", 
     "url"=> "envato" 
    ) 
    ); 
    $social_icon_wrapper = ' string'; 
    $type = ' string2'; 
    $count = 4; 

    if ($count > 0) { ?> 
    <div id="social-network"> 
     <ul class="social-icons"> 
     <?php foreach ($social_network as $i=>$sn){ 
      // var_dump($i); // this always returns fine 
      if ($i == 0) { $menu_item_class .= ' first'; } // for some reason this IF is always true 
      if ($i == ($count-1)) { $menu_item_class .= ' last'; } ?> 
      <?php if ($sn['title'] == 'ello') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="ello" href="https://ello.co/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-ello"></i></span>ello</a></li><?php } ?> 
      <?php if ($sn['title'] == 'vk') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="vk" href="https://vk.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-vk"></i></span>vk</a></li><?php } ?> 
      <?php if ($sn['title'] == 'facebook') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="facebook" href="https://www.facebook.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-facebook"></i></span>facebook</a></li><?php } ?> 
      <?php if ($sn['title'] == 'pinterest') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="pinterest" href="https://pinterest.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-pinterest"></i></span>pinterest</a></li><?php } ?> 
      <?php if ($sn['title'] == 'twitter') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="twitter" href="https://www.twitter.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-twitter"></i></span>twitter</a></li><?php } ?> 
      <?php if ($sn['title'] == 'lastfm') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="lastfm" href="http://www.last.fm/user/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-lastfm"></i></span>lastfm</a></li><?php } ?> 
     <?php } ?>  
     </ul> 
    </div> 

    <?php } 
} 
social_icons(); 

Я сделал простой pen, чтобы проиллюстрировать эту проблему. Пожалуйста, проверьте и дайте мне знать, что случилось.

+4

Разве это не потому, что, как только вы установите переменную она не изменяется в течение следующего цикла? ('If' только true один раз - вы можете« эхо »проверить это, но значение установлено и не изменено последним - теперь переменная имеет значение'. = 'First'', правильно?) – FirstOne

+0

Вы должны проверить код и вывод пера. – thednp

+0

Класс 'first' установлен для всех' LI', а 'last' установлен правильно только для последнего. @ chris85 Я просто попробовал ваше решение безрезультатно. – thednp

ответ

1

Точно так же вы можете понять, принять LOOL на this code.

И еще объяснение: у вас есть переменная $class_name, которая имеет, например, значение abc после того, как он входит в foreach и $i IS равна 0, $class_name будет abc first. Но с этого момента вы будете продолжать получать доступ к $class_name, то есть, угадайте, что, abc first.

This Code изменяется, чтобы сохранить правильное значение (обратите внимание, что это может быть не лучшим образом, но то, что вы должны понять, что, как только вы добавляете first к переменной, в следующий раз, когда вы к нему доступ, он будет там).

Взгляните на // ADDED THIS LINE линии:

function social_icons($menu_item_class='', $icon_class='', $title_class = ''){ 
    $menu_item_class .= ($title_class != '') ? ' no-title' : ''; 
    $original_class = $menu_item_class; // ADDED THIS LINE 
    $social_network = array(
     0=> array (
     "title"=> "ello", 
     "url"=>"envato" 
    ), 
     1=> array (
     "title"=> "vk", 
     "url"=> "envato" 
    ), 
     2=> array (
     "title"=> "twitter", 
     "url"=> "envato" 
    ), 
     3=> array (
     "title"=> "lastfm", 
     "url"=> "envato" 
    ) 
    ); 
    $social_icon_wrapper = ' string'; 
    $type = ' string2'; 
    $count = 4; 

    if ($count > 0) { ?> 
    <div id="social-network"> 
     <ul class="social-icons"> 
     <?php foreach ($social_network as $i=>$sn){ 
      // var_dump($i); // this always returns fine 
      $menu_item_class = $original_class; // ADDED THIS LINE 
      if ($i == 0) { $menu_item_class .= ' first'; } // for some reason this IF is always true 
      if ($i == ($count-1)) { $menu_item_class .= ' last'; } 
      ?> 
      <?php if ($sn['title'] == 'ello') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="ello" href="https://ello.co/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-ello"></i></span>ello</a></li><?php } ?> 
      <?php if ($sn['title'] == 'vk') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="vk" href="https://vk.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-vk"></i></span>vk</a></li><?php } ?> 
      <?php if ($sn['title'] == 'facebook') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="facebook" href="https://www.facebook.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-facebook"></i></span>facebook</a></li><?php } ?> 
      <?php if ($sn['title'] == 'pinterest') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="pinterest" href="https://pinterest.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-pinterest"></i></span>pinterest</a></li><?php } ?> 
      <?php if ($sn['title'] == 'twitter') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="twitter" href="https://www.twitter.com/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-twitter"></i></span>twitter</a></li><?php } ?> 
      <?php if ($sn['title'] == 'lastfm') { ?> <li class="<?php echo $menu_item_class; ?>"><a class="lastfm" href="http://www.last.fm/user/<?php echo $sn['url']; ?>"><span class="social-icon-wrapper<?php echo $type; ?>"><i class="<?php echo $icon_class; ?> social-lastfm"></i></span>lastfm</a></li><?php } ?> 
     <?php } ?>  
     </ul> 
    </div> 

    <?php } 
} 
social_icons(); 
+0

Таким образом, '$ menu_item_class' необходимо кэшировать и перезагружать внутри цикла. Я думаю, что это отличается от Javascript. Огромное спасибо. – thednp

+1

В принципе, да. Вы могли бы сделать обратное и вместо этого изменить другую переменную (я сделал это так, потому что я ленив, и я не хотел искать каждое появление '$ menu_item_class'). Во всяком случае, основная проблема: вы изменили значение переменной, поэтому каждый последующий доступ к ней принесет новое значение (с «первым») не оригинальным (без «первого»). Обратите внимание, что условие истинно только один раз. – FirstOne

0

попробовать этот

$class_name =''; 
if ($i == 0) { $class_name = ' first'; } 
+0

Это может удалить что-то, что уже находится в '$ class_name'. – FirstOne

+0

Lol, его код на самом деле не ясен, возможно, нет. – Jah

+0

Хорошо, это нужно, чтобы стереть то, что уже находится в '$ class_name'. Если вы посмотрите на вопрос ([pen] (http: //codepad.viper-7.com/poZ3jU), вы увидите, что эта переменная (которая, похоже, имеет другое имя - '$ menu_item_class'), поступает из параметра функции и может содержать значение. Никакой грубости не было.^ – FirstOne

Смежные вопросы