PHP: подсчет элементов в массиве, деление итогов на два, создание двух списков UL с равным количеством элементов, содержащих элементы из массива - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть массив, содержащий данные (идентификационные номера и связанные с ними данные).

Количество элементов в массиве всегда является переменным и неизвестно.

Я хочу разделить этот массив на две равные части, ЕСЛИ в исходном массиве более 2 элементов (не срез).

Затем я хочу создать два независимых списка UL, содержащих полученные элементы срезов массива. Если общее количество элементов в исходном массиве нечетно, первый список должен содержать еще один элемент.

Я придумал это, но я уверен, что я делаю это неправильно ... содержимое, отображаемое в выходных данных, почти одинаково для каждого списка UL, только переупорядочено, плюс в моем случае число нечетное ( если я повторяю $ items, то получится 3.5).

  $panels = get_field('related_content');
  $items = count($panels);
  if ($items > 2) {
      $split = $items / 2;
      $firsthalf = array_slice($panels, $plit );
      $secondhalf = array_slice($panels, 0, $plit);
      echo '<div class="related-carousel"><ul>'; 
      foreach($firsthalf as $post_object) :
              printf('<li><a target="_blank" title="'.get_the_title($post_object->ID).'" href="'.get_permalink($post_object->ID).'"><span class="thumb">'.get_the_post_thumbnail($post_object->ID, 'smallest').'</span><span class="thumb-title"><h6>'.get_the_title($post_object->ID).'</h6></span></a><span>'.sg_get_the_excerpt().'</span></li>');
      endforeach;
      echo'</ul></div>';
      echo '<div class="related-carousel"><ul>'; 
     foreach($secondhalf as $post_object) :
             printf('<li><a target="_blank" title="'.get_the_title($post_object->ID).'" href="'.get_permalink($post_object->ID).'"><span class="thumb">'.get_the_post_thumbnail($post_object->ID, 'smallest').'</span><span class="thumb-title"><h6>'.get_the_title($post_object->ID).'</h6></span></a><span>'.sg_get_the_excerpt().'</span></li>');
     endforeach;
     echo'</ul></div>';
  }
  else {
        echo '<div class="related-carousel"><ul>';  
        foreach($panels as $post_object) :
                printf('<li><a target="_blank" title="'.get_the_title($post_object->ID).'" href="'.get_permalink($post_object->ID).'"><span class="thumb">'.get_the_post_thumbnail($post_object->ID, 'smallest').'</span><span class="thumb-title"><h6>'.get_the_title($post_object->ID).'</h6></span></a><span>'.sg_get_the_excerpt().'</span></li>');
        endforeach;
        echo'</ul></div>';
  }

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Вам необходимо изменить аргумент $plit из array_slice на $split! Всегда полезно включать отчеты об ошибках, которые помогают при таких ошибках: error_reporting(E_ALL).

Возможно, вам нужно изменить переменную $split, например, используя ceil(), отредактируйте: посмотрите ответ AndVla

1 голос
/ 20 декабря 2011

Думаю, вы сможете решить эту проблему следующим образом:

$split = ($items+1) / 2;

или

$split = ceil($items / 2);
0 голосов
/ 18 июня 2014

Тим прав, но вы также, вероятно, хотите, чтобы первая половина была первой половиной массива, а не наоборот, как у вас сейчас.Это потому, что аргументы слайса: $output = array_slice($input, $offset, $length);.Поэтому вы захотите установить свои переменные следующим образом: $firsthalf = array_slice($panels, 0, $split); $secondhalf = array_slice($panels, $split, $items);

Cheers

...