Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: foreach ограничение на вывод
Форумы портала PHP.SU » PHP » Программирование на PHP » foreach ограничение на вывод

Страниц (1): [1]
 

1. Golovastik - 29 Января, 2011 - 00:46:52 - перейти к сообщению
Как через цикл foreach вывести не весь массив а например с 1 по 2 элемент?
Если например имеем такой массив.

PHP:
скопировать код в буфер обмена
  1.  
  2. $a = array( //Объявлени массива
  3. "green"  => "Зелёный",
  4. "yellow" => "жёлтый",
  5. "white"  => "белый",
  6. "black"  => "Чёрный",
  7. "blue"   => "Синий",
  8. );
  9.  
2. EuGen - 29 Января, 2011 - 00:50:31 - перейти к сообщению
Логичнее через for
Если же принципиален foreach, то используйте break
3. Golovastik - 29 Января, 2011 - 01:00:45 - перейти к сообщению
Да, можно вот так сделать.
PHP:
скопировать код в буфер обмена
  1.  
  2. $i = 0;
  3. foreach($a as $key =>$one){
  4. $i++;
  5. if($i >3) break;
  6. printf("%s - %s ",$key,$one);
  7. echo "\n";
  8. }
  9.  


Какие варианты лучше есть?
4. Uchkuma - 29 Января, 2011 - 11:35:50 - перейти к сообщению
Через foreach где-то так и получится. Только можно, например, счетчик с бриком поставить не вверху, а внизу и при достижении количества элементов на следующую итерацию не заходить.
(Добавление)
А еще есть array_slice.
5. OrmaJever - 29 Января, 2011 - 14:07:33 - перейти к сообщению
Мне кажется самый лутший и понятный вариант это как написал Golovastik
PHP:
скопировать код в буфер обмена
  1. $arr = array(5=>'a', 4=>'b', 3=>'c', 2=>'d', 1=>'e');
  2. $i = 0;
  3. foreach($arr as $k =>$v){
  4.         echo $k.' => '.$v."<br>\n";
  5.         if(++$i == 3) break;
  6. }
6. JustUserR - 29 Января, 2011 - 23:15:59 - перейти к сообщению
Golovastik пишет:
Как через цикл foreach вывести не весь массив а например с 1 по 2 элемент
Использование языка PHP предполагает осуществление огранизации списковых объектов в виде унифицированных ассоциативных массивов с поддержкой прямого внутренного индекса ассоциированного с текущим выбранным элементом - таким образом наиболее простым и эффективным вариантом решения поставленной задачи является использование функций типа each
7. LEONeso - 30 Января, 2011 - 01:48:10 - перейти к сообщению
Golovastik пишет:
Как через цикл foreach вывести не весь массив а например с 1 по 2 элемент?
Если например имеем такой массив.

PHP:
скопировать код в буфер обмена
  1.  
  2. $a = array( //Объявлени массива
  3. "green"  => "Зелёный",
  4. "yellow" => "жёлтый",
  5. "white"  => "белый",
  6. "black"  => "Чёрный",
  7. "blue"   => "Синий",
  8. );
  9.  


после надо дописать следующий код:
PHP:
скопировать код в буфер обмена
  1. foreach(range(1,2) as $key)
  2.             {echo $a[$key].'<br>';}//указываем массив, далее подставляются ключи

выдаст: желтый, белый

--
зы: Не знаю, что все к for() прицепились... вопрос достаточно прямолинеен.
8. annihilus - 30 Января, 2011 - 02:25:55 - перейти к сообщению
LEONeso пишет:
выдаст: желтый, белый

Интересно каким образом?

Скорее всего выдаст:
Notice: Undefined index 1,2 ....
9. LEONeso - 30 Января, 2011 - 04:04:20 - перейти к сообщению
annihilus, данный пример работает при ключах типа 0+

рабочий пример:
PHP:
скопировать код в буфер обмена
  1. $a = array(
  2. "Зелёный",
  3. "жёлтый",
  4. "белый",
  5. "Чёрный",
  6. "Синий",
  7. );
  8.  
  9.       foreach(range(1,2) as $key)
  10.  
  11.                   {echo $a[$key].'<br>';}//указываем массив, далее подставляются ключи

массив сам расставляет ключи от 0 и далее
10. annihilus - 30 Января, 2011 - 13:26:06 - перейти к сообщению
LEONeso пишет:
annihilus, данный пример работает при ключах типа 0+

рабочий пример:
PHP:
скопировать код в буфер обмена
  1. $a = array(
  2. "Зелёный",
  3. "жёлтый",
  4. "белый",
  5. "Чёрный",
  6. "Синий",
  7. );
  8.  
  9.       foreach(range(1,2) as $key)
  10.  
  11.                   {echo $a[$key].'<br>';}//указываем массив, далее подставляются ключи

массив сам расставляет ключи от 0 и далее


да я в курсе , просто тема про массив со строковыми индексами)
11. LifePlay - 30 Января, 2011 - 14:32:52 - перейти к сообщению
Вариант создания другого массива с нужным содержимым.
Функция array_slice

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $a = array( //Объявлени массива
  3. "green"  => "Зелёный",
  4. "yellow" => "жёлтый",
  5. "white"  => "белый",
  6. "black"  => "Чёрный",
  7. "blue"   => "Синий",
  8. );
  9.  
  10.  
  11. echo 'До : ';
  12. print_r($a);
  13.  
  14. // Начало
  15. $timegenerstart = microtime();
  16. $start_array = explode(" ",$timegenerstart);
  17. $timegenerstart = $start_array[1] + $start_array[0];
  18.  
  19. for ($i=1; $i<=1000000; $i++)
  20. {
  21. $b = array_slice($a, 3, 2);
  22. }
  23.  
  24. // Конец
  25. $timegeneraut=microtime();
  26. $end_array = explode(" ",$timegeneraut);
  27. $timegeneraut = $end_array[1] + $end_array[0];
  28. $timegenerresyltat = ($timegeneraut-$timegenerstart);
  29.  
  30. echo '<br/><br/> После : ';
  31. print_r($b);
  32. echo '<br/> Результат : '.$timegenerresyltat.'<br/><br/>';
  33. ?>


Провёл тест на время выполнения.
1000000 раз выполняется в среднем за 0.979366 сек

Потом foreach масива $b
12. LEONeso - 30 Января, 2011 - 20:55:09 - перейти к сообщению
annihilus пишет:
LEONeso пишет:
annihilus, данный пример работает при ключах типа 0+

рабочий пример:
PHP:
скопировать код в буфер обмена
  1. $a = array(
  2. "Зелёный",
  3. "жёлтый",
  4. "белый",
  5. "Чёрный",
  6. "Синий",
  7. );
  8.  
  9.       foreach(range(1,2) as $key)
  10.  
  11.                   {echo $a[$key].'<br>';}//указываем массив, далее подставляются ключи

массив сам расставляет ключи от 0 и далее


да я в курсе , просто тема про массив со строковыми индексами)


Ладно, пусть будет так:
PHP:
скопировать код в буфер обмена
  1. $a = array(
  2. "green"  => "Зелёный",
  3. "yellow" => "жёлтый",
  4. "white"  => "белый",
  5. "black"  => "Чёрный",
  6. "blue"   => "Синий",
  7. );
  8. $a = implode("~",$a);
  9. $a = explode("~",$a);
  10.       foreach(range(1,2) as $key)
  11.       {echo $a[$key].'<br>';}//указываем массив, далее подставляются ключи


выведет: жёлтый, белый

думаю, работать будет дольше т.к. тут сразу вывод результата.
тест по пред посту выдал Результат : 4.41442489624, без ehco

данный пример, выводится быстрее в 2 раза:
PHP:
скопировать код в буфер обмена
  1. $a = array(
  2. "green"  => "Зелёный",
  3. "yellow" => "жёлтый",
  4. "white"  => "белый",
  5. "black"  => "Чёрный",
  6. "blue"   => "Синий",
  7. );
  8. $a = array_slice($a, 1, 2);
  9.       foreach($a as $b) {echo $b.', ';}
13. JustUserR - 31 Января, 2011 - 19:36:52 - перейти к сообщению
LEONeso пишет:
Не знаю, что все к for() прицепились... вопрос достаточно прямолинеен.
Использование языка PHP предполагает осуществление хранения списковых информационных полей в виде объектов ассоциативных массивов - что обеспечивает включение дополнительных накладных расходов на процесс произведение расчета целевого выражения с содержание описанря ключа и осуществление перевода уровня его трактования в элементое содержимое потока кода - по этой причине использование реальных внутренних индексов является более эффективным
14. LEONeso - 31 Января, 2011 - 21:32:38 - перейти к сообщению
JustUserR, понял только "использование реальных внутренних индексов является более эффективным" Закатив глазки

 

Powered by ExBB FM 1.0 RC1