Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вывести в цикле каждый второй элемент
 
 автор: dima2207   (13.05.2010 в 16:16)   письмо автору
 
 

как при выводе массива в foreach() или for() каждый второй элемент пропускать

  Ответить  
 
 автор: sim5   (13.05.2010 в 16:19)   письмо автору
 
   для: dima2207   (13.05.2010 в 16:16)
 

Проверять младший разряд итерации цикла.

  Ответить  
 
 автор: cheops   (13.05.2010 в 17:15)   письмо автору
 
   для: dima2207   (13.05.2010 в 16:16)
 

Можно отталкиваться от следующего скрипта
<?php
  
for($i 0$i 100$i++)
  {
    if(
$i 2) echo "$i<br>";
  }
?>

  Ответить  
 
 автор: dima2207   (13.05.2010 в 17:19)   письмо автору
 
   для: cheops   (13.05.2010 в 17:15)
 

спасибо cheops то что надо .

  Ответить  
 
 автор: sim5   (13.05.2010 в 17:30)   письмо автору
 
   для: dima2207   (13.05.2010 в 17:19)
 

Лучше использовать для этого логическую операцию.

  Ответить  
 
 автор: cheops   (13.05.2010 в 17:32)   письмо автору
 
   для: sim5   (13.05.2010 в 17:30)
 

Поразрядную? В примере выше как раз логическая операция.

  Ответить  
 
 автор: sim5   (13.05.2010 в 17:42)   письмо автору
 
   для: cheops   (13.05.2010 в 17:32)
 

<?php 
for($i 0$i 8$i++) echo !($i&1) ? $i."<br>" null

  Ответить  
 
 автор: Trianon   (13.05.2010 в 19:34)   письмо автору
 
   для: sim5   (13.05.2010 в 17:42)
 

мама мия...
<?
 
for($i 0$i 8$i+=2)      echo $i."<br>" ;  




PS. Для while/foreach таки да - проверкой.

  Ответить  
 
 автор: nikita2206   (13.05.2010 в 20:46)   письмо автору
 
   для: Trianon   (13.05.2010 в 19:34)
 

ахахааха), все гениальное - просто

  Ответить  
 
 автор: Desko   (13.05.2010 в 21:04)   письмо автору
 
   для: sim5   (13.05.2010 в 17:42)
 

>

>for($i = 0; $i < 8; $i++) echo !($i&1) ? $i."<br>" : null; 
>


А не могли бы пояснить нубу что это или где можна прочитать про это???? оО

И if($i % 2) - как оно работает без ==?

  Ответить  
 
 автор: cheops   (13.05.2010 в 21:33)   письмо автору
 
   для: Desko   (13.05.2010 в 21:04)
 

>>

>>for($i = 0; $i < 8; $i++) echo !($i&1) ? $i."<br>" : null; 
>>

>
>А не могли бы пояснить нубу что это или где можна прочитать про это???? оО
А про что именно (может в рамках форума можно объяснить)?

>И if($i % 2) - как оно работает без ==?
Дело в том, что выражение в if неявно приводится к логическому типу, все что 0 - false, все что отлично от нуля - true.

  Ответить  
 
 автор: Desko   (13.05.2010 в 21:43)   письмо автору
 
   для: cheops   (13.05.2010 в 21:33)
 

Интересует строка echo !($i&1) ? $i."<br>" : null;>>>[code]
В принципе непонятно ничего!!! Это вообще PHP?

  Ответить  
 
 автор: cheops   (13.05.2010 в 21:55)   письмо автору
 
   для: Desko   (13.05.2010 в 21:43)
 

Здесь используется тренарный оператор x ? y : z, который возвращает y, если x == true и z, в противном случае. Он достаточно редко применяется из-за его низкой читабельности, но считается более удобным по сравнению с if(x) { y } else { z }, если y и z - однострочные операторы.

  Ответить  
 
 автор: nikita2206   (13.05.2010 в 21:55)   письмо автору
 
   для: Desko   (13.05.2010 в 21:43)
 

& - это побитовое "И".
Предположим что переменная $i содержит число 6, это число в двоичном представлении дает нам вот что: 110.
Вот из мануала, или откуда-то еще: $a & $b - Побитовое 'и'. Устанавливаются только те биты, которые установлены и в $a, и в $b.

Смотрим: у нас есть 110 и 1. 1 приведем к 001 для простоты... Получается 110 И 001, получается 0. Если вы еще не поняли, то все четные числа в двоичном представлении заканчиваются на 0... Вот и получается, что если к этому оператору еще отрицание добавить, то мы будем получать четность числа...

  Ответить  
 
 автор: Desko   (13.05.2010 в 22:13)   письмо автору
 
   для: nikita2206   (13.05.2010 в 21:55)
 

Понял спасибо

  Ответить  
 
 автор: sim5   (14.05.2010 в 04:38)   письмо автору
 
   для: nikita2206   (13.05.2010 в 21:55)
 

Лигическое И, это логическая операция, которая может быть бинарной (иметь два операнда), тринарной (иметь три операнда), n-арной (иметь n операндов) операцией, и в результате выдает 1, если все операнды равны 1, в противном случае 0.
Называется логическим умножением или конъюкцией (от латинского conjunctio, что означает союз, связь). Логическое И часто применяется как маска для выделения n-разрядов в позиции операнда.

Если речь у автора шла именно о "пропустить", то решать надо так, как написано у Trianon, но если автор имел ввиду (что зачастую и спрашивают) чередование вывода чего-то, то это только проверкой. А взята логическая операция потому, что она более быстрая нежели деление, так как требуется загрузка всего одного операнда в аккумулятор, где и производятся операции, в данном случае всего над одним операндом. Зачастую и само деление можно (и нужно при интенсивных вычислениях) заменять логической операцией сдвига, это будет работать гораздо быстрее.

  Ответить  
 
 автор: Trianon   (14.05.2010 в 12:44)   письмо автору
 
   для: sim5   (14.05.2010 в 04:38)
 

>Логическое И, это логическая операция, которая может быть бинарной (иметь два операнда), тринарной (иметь три операнда), n-арной (иметь n операндов) операцией, и в результате выдает 1, если все операнды равны 1, в противном случае 0.


Логическое И - бинарная, и лишь бинарная операция.
Тренарной ( тетрарной и n-арной ) может быть лишь композиция нескольких атомарных операций.
a&b&c - это не тренарная операция. Это только сокращение от (a&b)&c

  Ответить  
 
 автор: sim5   (14.05.2010 в 12:57)   письмо автору
 
   для: Trianon   (14.05.2010 в 12:44)
 

Ошибаетесь. Речь идет не о прдеставлении данных (двоичные), а о логическом вентеле на n-входов.

  Ответить  
 
 автор: Trianon   (14.05.2010 в 13:42)   письмо автору
 
   для: sim5   (14.05.2010 в 12:57)
 

логический вентиль на N входов, реализующий композитную операцию, я представляю себе лишь на многоэмиттерном транзисторе.

Вот когда хотя бы один язык программирования будет компилироваться в код, при котором операнды операции И будут подаваться на входы физически соответствующее этим самым эмиттерам - тогда и поговорим.

А до той поры это чушь. Математически операция И является бинарной и точка.

  Ответить  
 
 автор: sim5   (14.05.2010 в 14:03)   письмо автору
 
   для: Trianon   (14.05.2010 в 13:42)
 

Вот только не надо говорить о яйце и курице.;-)
Логика, ее базовые элементы, родились задолго до появления первого процессора, и понятия о логических операциях происходят от туда. Как решает задачу процессор, об этом и речи не было. Это и ежу понятно, что процессор не будет соеденять n-регистров или ячеек памяти в физическое "И", дабы произвести логическую операцию на n-операндами. Так что, это вы не в ту сторону пошли в своих рассуждениях.
Да и базовые элементы логики, это совсем не обязательно многоэммитерные транзисторы.

  Ответить  
 
 автор: Trianon   (14.05.2010 в 16:33)   письмо автору
 
   для: sim5   (14.05.2010 в 14:03)
 

так тем более нет n-арных логических операций.

также точно как нет операции суммирования, хотя есть операция сложения.

  Ответить  
 
 автор: sim5   (14.05.2010 в 16:40)   письмо автору
 
   для: Trianon   (14.05.2010 в 16:33)
 

Логичекий элемент базовой логики может иметь любое количество входов, как и никто не запрещает производить лигическую операцию И над любым числом операндов (имеется ввиду запись): 1 & 3 & 2 & 6 & .... Речь изначально шла именно об этом.
А вы что доказываете? Вы хотите переписать базовые понятия логики?

  Ответить  
 
 автор: Trianon   (14.05.2010 в 17:29)   письмо автору
 
   для: sim5   (14.05.2010 в 16:40)
 

логический элемент базового набора логических микросхем это еще не логическая операция базовой логики как раздела математики.

микросхемы - это вообще не печка, от которой стоит плясать.
А в логике как науке, операция И - бинарная.

Запись же 1& 3 & 5 & 7 означает именно то, что я написал. Композицию (цепочку элементарных) операций согласно заданным правилам приоритета и ассоциативности. Даром, что они (приоритет и ассоциативность) на результат (в побитовом варианте) не влияют.

  Ответить  
 
 автор: sim5   (14.05.2010 в 17:31)   письмо автору
 
   для: Trianon   (14.05.2010 в 17:29)
 

Какой-то беспредметный и бесполезный спор.

  Ответить  
 
 автор: cheops   (15.05.2010 в 12:41)   письмо автору
 
   для: Trianon   (14.05.2010 в 17:29)
 

Полез в книги по алгебре... вообще-то можно операции x & y & ... & z трактовать как n-арные, понятие n-арной операции это не запрещает. Только обычно сворачивают такие пространства до бинарных операций, так как на них можно строго построить отношения порядка и эквивалентности. Такая свертка приводит к понятию композиции и позволяет оставаться в пространстве бинарных отношений.

  Ответить  
 
 автор: sim5   (15.05.2010 в 12:53)   письмо автору
 
   для: cheops   (15.05.2010 в 12:41)
 

Ну об этом речь и была ) Если говорить о просто логическом элементе, так в нем сравнение происходит вопреки нашим понятиям и условностям, работают сразу все все входы вентеля, и соответственно операция умножения сразу всех операндов.

  Ответить  
 
 автор: Trianon   (16.05.2010 в 16:13)   письмо автору
 
   для: cheops   (15.05.2010 в 12:41)
 

Про то и речь :))

Впрочем, n-арную операцию всяко пришлось бы записать как-то иначе.
не как x&y&z&t а как _and_(x,y,z,t) к примеру.
Потому как иначе возникла бы семантическая неоднозначность -
не отличить запись n-арной операции от записи композиции более простых.

  Ответить  
 
 автор: sim5   (16.05.2010 в 16:35)   письмо автору
 
   для: Trianon   (16.05.2010 в 16:13)
 

Даже не смотря на то, что существуют компьютеры, никто не отменял и никуда не канули устройства на обычных логических элементах. Изначально перед разработчиком соит задача решения функции над входными данными, которая требует n-элементов различной логики для этого. Мнемонизация функций позволяет исключить из устройства "лишние" элементы, и вместо требемого изначально, например, элемента 6И, в конечном итоге для реализации функции достаточно будет элемента 3И-НЕ.
Кроме того, хоть велика роль контроллеров, существовали и будут существовать ИС, в основе которых программируемые логические матрицы (PLM).
Для всех этих устройств понятие "логические операции могут быть только бинарными" просто абсурдно. Да оно вообще абсурдно такое утверждение по смыслу. Да и логические операции появились задолго до компьютеров и средств программрования их. Вот об этом была речь. Вы же явно утверждали противоположное.

  Ответить  
 
 автор: Trianon   (16.05.2010 в 16:54)   письмо автору
 
   для: sim5   (16.05.2010 в 16:35)
 

Вы можете оставаться при своем мнении.
Как и в ситуации с тем, что можно (а что нельзя ) называть виртуальной памятью, спорить с Вами надоело.

  Ответить  
 
 автор: sim5   (16.05.2010 в 17:00)   письмо автору
 
   для: Trianon   (16.05.2010 в 16:54)
 

>А в логике как науке, операция И - бинарная.

Это ваши слова. Я могу конечно остаться при своем мнении, но для логики как раз, такое утверждение абсурд. Это равнозначно как иметь выражения:
2+2+2+2=8
и
2х4=8
при этом утверждать, что первое из них не имеет право на существовние, и может быть только второе.
Виртуальная память, понятие довольно таки оносительное, если уж и говорить строго.

  Ответить  
 
 автор: Trianon   (17.05.2010 в 03:18)   письмо автору
 
   для: sim5   (16.05.2010 в 17:00)
 

Первое имеет право на существование. И означает ровно то, о чем пишут в учебниках первого класса.
Если к двойке добавить двойку, добавить еще двойку, и еще двойку, то получится восемь.

Потому как операция сложения тоже бинарная :)

Я Вам больше скажу.
На человеческом языке Вы тернарную операцию И не сможете выразить даже, не употребив при этом двух союзов. То есть не обозначив фактически намерения выполнить операцию дважды.
Тернарная операция, существуй её человеческий эквивалент, потребовала бы одного слова для обозначения.

Cheops тут упоминает, что в самом общем смысле, конечно операции более высокого порядка можно ввести, коль охота, выразив их через композиции. Таки да.
Примерно так это выражается по-русски.
Канонически: тепло и светло и мухи_не_кусают
По Вашему: тепло, светло, мухи не кусают одновременно

Вопрос: Как обычно говорят?

Таблица тернарнаой операции умножения на задней стороне школьной тетрадки потребовала бы для записи тысячи строк.

  Ответить  
 
 автор: sim5   (17.05.2010 в 10:55)   письмо автору
 
   для: Trianon   (17.05.2010 в 03:18)
 

Логика, сугубо говоря, это не обязательно прерогатива компьютеров и языков программирования. Логика мышления требуется во многих сферах жизнедеятельности человека. Создав компьютер, язык программирования человек создавал уже как набор элементарных операций, которые могли бы описать ход его естественного мышления, ибо любая программа по сути таковой и является - отражением нашего мышления, представлений о том, или ином, задачи, решение которой мы возлагаем на компьютер.
Ни одно из базовых "постулатов" логики: сравнение (И), совпадение (ИЛИ), исключение (ИСКЛЮЧАЕЩЕЕ ИЛИ) не исключает, что любое из этих действий может производиться над любым множеством объектов. Исключение составляет только суждение (отрицание суждения, НЕ).

Вы пригласили в ресторан четырех друзей с условием, что каждый из них должен быть одет в смокинг. Если все четверо предстанут пред вами одновременно, вам будет достаточно одного взгляда, чтобы понять, выполнено ваше условие или нет. Но если приглашенных будет сотни, то окинуть взглядом сразу всех будет не возможно - вы будете проверять каждого в отдельности. При этом если уже первый из них не будет в смокинге, то дальнейшую проверку вы уже производить не будете - условие уже не выполнено.
Если трое друзей в ресторане будут держать над вашей чашечкой кофе три ложечки, предлагая добавить в него коньяк, то вы оцените ситуацию сразу - любая из ложечек с коньяком будет отличаться от пустых соседних. Вы без долгих проверок поймете, что таки насладитесь незабываемым кофе. Но если такое предложение последует от десятка друзей, вы будете вынуждены проверять каждую ложечку в отдельности, и поймете уже после первой, же попавшейся ложечки с коньяком, что кофе будет незабываемым. Да большего "ИЛИ" и не надо, вредно для здоровья.

Мы мыслим образно, и все такие логические задачи решаем сразу, хотя при этом в нашем мозгу, возможно, решается миллионы элементарных задач. Но имея возможность решить логическую задачу за "один проход", параллельно, мы, тем не менее, можем решать ее и последовательно, изучая каждый объект в отдельности на предмет выполнения условий. Но когда условия позволяют решить задачу сразу, параллельно, мы этого делать не станем, мы не будем тратить время на неоправданные действия, и это тоже следствие нашей логики.
Если я увижу запись выражения:
echo true & true & true & true;
то мне даже Денвер запускать не нужно, я и без интерпретатора буду знать, что получу в результате 1. Я оценю всю запись сразу, даже не читая ее слева на право, идентичность всех ее операндов легко читается визуально, сразу всех. А вот интерпретатору придется «попотеть».

Процессор мыслит плоско последовательно, выполняя каждую операцию под воздействием тактовых импульсов, при этом для выполнения команд требуются от одного до нескольких тактов. В любом случае, процессор будет выполнять логические операции последовательно, независимо от того, над каким числом входных данных это действие производится. Но ведь сам процессор, на элементарном уровне, действует более эффективно. Получив команду, он ее дешифрирует, подключая, таким образом, блок микропрограммного управления, который, в свою очередь, соединит необходимые узлы шиной, решив поставленную логическую задачу. При этом уже сам этот процесс может требовать сравнение n-данных согласно условию, и это сравнение будет происходить сразу над всеми данными.
Когда-то этого было вполне достаточно. Иерархия процессора, взаимодействие всех узлов его архитектуры можно было считать идеальным. Время показало, что нет. Узкие места такого подхода не позволяют решать все возрастающие по объему задачи, поэтому идея параллельных процессоров, это естественный ход событий. Но и у этого решения есть предел.

Не стоит сомневаться в том, что появятся другие процессоры (а может быть и не процессоры, может быть, это будет называться как-то иначе), которые будут мыслить образно, также как это делает мозг человека. Тогда нынешние процессоры может, и будут выполнять в такой иерархии роль элементарных кирпичиков, не более, а может они, и вообще прекратят свое существование. При этом главный мозг такой иерархии сможет сравнивать множество объектов сразу, не последовательно, и гораздо большее число объектов, чем которым может оперировать человек.
Возможно, что человечество узнает о новом измерении пространства, и тогда выражение И первый И второй И третий И… будет дополнено новыми условиями, но именно дополнено, а не подвергнуто сомнению, ибо само это выражение вполне логично.

Процесс же оптимизации логических (и не только) выражений, это естественный процесс, позволяющий исключить лишние узлы или действия в итоге. Если говорить относительно программного решения условия, причем на действующих в настоящее время процессорных архитектурах, то можно говорить, лишь о том, что в итоге условие может быть выполнено последовательно. Но если речь идет об аппаратном уровне решения условия, то в данном случае эффективнее действовать иначе, обрабатывая сразу все входные данные.
Утверждение, что поставленное условие может решаться только так и не иначе, опираясь представлением только одной области его применения, крайне пагубно для понимания базовых знаний теми, кто только начинает их изучать. Следствие такого непонимания можно наблюдать часто, когда забегают далеко вперед, ища там ответа. Когда не могут из явного описания функций выбрать нужную. А нужно всего лишь «разложить по полочкам» естественный ход собственного мышления, из которого явно будет вытекать «это самое описание» этих самых необходимых функций. Оптимизация же, это последующий процесс. Только так и никак иначе: в глобальном плане – сверху вниз, от общего к частному; в частностях – снизу вверх, от широких возможностей базовых основ, до их минимизации.

  Ответить  
 
 автор: Tonik992   (13.05.2010 в 22:20)   письмо автору
 
   для: Desko   (13.05.2010 в 21:04)
 

$i&1 - делает проверку первого бита...

допустим число $i = 254;. В машинном представлении это число хранится в двоичном коде, и шифруется вида:
1111 1110...
Единица в двоичном коде будет - 0000 0001..

Делаем проверку:
1111 1110 &
0000 0001....
Тут происходит операция И... Вернет естесно нуль....
Здесь происходит проверка бита каждого разряда и возвращается искомое число...

Если бы было
1110 0011 &
0010 1101

получили бы число, вида:
0010 0001...

  Ответить  
 
 автор: sim5   (14.05.2010 в 04:46)   письмо автору
 
   для: Tonik992   (13.05.2010 в 22:20)
 

>$i&1 - делает проверку первого бита...

В булевой алгебре (логике) нет первого бита, есть младший бит.

  Ответить  
 
 автор: Tonik992   (14.05.2010 в 15:08)   письмо автору
 
   для: sim5   (14.05.2010 в 04:46)
 

Эквивалентно

  Ответить  
 
 автор: sim5   (14.05.2010 в 15:12)   письмо автору
 
   для: Tonik992   (14.05.2010 в 15:08)
 

Вы уверены?

  Ответить  
 
 автор: Tonik992   (14.05.2010 в 15:15)   письмо автору
 
   для: sim5   (14.05.2010 в 15:12)
 

мне для удобство лучше общаться таким языком, а не булевой алгеброй

  Ответить  
 
 автор: sim5   (14.05.2010 в 15:18)   письмо автору
 
   для: Tonik992   (14.05.2010 в 15:15)
 

Двоичная арифметика (как и десятичная), это от младшего разряда к старшему, справа налево. А вот 1-й, так кому-то может удобно считать таковым разряд слева, по принципу - читаем слева на право. ;-)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования