Пятница. Говнокод. Парсинг плейсхолдеров.

WMix

герр M:)ller
Партнер клуба
про yield - ну это тот же while ($row = $db->fetch()) получится
да но звучать будет современней, привычней, человечней...
PHP:
foreach($db->getAll(...) as $row){}
а делать будет то как ты сказал (или я непонял как елда работает)
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
application (не система в смысле) так завелось
 

hell0w0rd

Продвинутый новичок
fixxxer, а я придумал вариант где этот способ не подойдет - когда нужно ответ куда-то передать, куда-то, где ждут массива, например в шаблон.
 

WMix

герр M:)ller
Партнер клуба
PHP:
function getAll() {
  $data = array(
      array('a' => 1),array('a' => 2),array('a' => 3)
  );
  foreach($data as $key => $val ) {
      yield $key => $val;
  }
}
$data = getAll();
echo $data[1];
Код:
Fatal error:  Cannot use object of type Generator as array in [...][...] on line 10
не говно
 

WMix

герр M:)ller
Партнер клуба
так да, работает
PHP:
$data = getAll();
print_r(iterator_to_array($data)[1]);
Код:
Array
(
  [a] => 2
)
захотелось ArrayAccess написать, который будет ленивым и данные подгружать порциями до первого найденного результата
чтоб iterator_to_array не использовать
 

hell0w0rd

Продвинутый новичок
WMix, ага, тоже о таком подумал) Плюс можно сделать
PHP:
foreach($data['name'] as $name => $data) {}
 

WMix

герр M:)ller
Партнер клуба
с индексами? ) иппаться, так по настоящему?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Я вот кстати хочу ещё сделать небольшой наброс про типизированные плейсхолдеры и их замену на значения.

Вот например, у нас есть в запросе конструкция 'where ... foo = :bar%!$@# ...', где троеточиями обозначены какие-то другие операторы в where, а конструкция '%!$@#' обозначает, что подстановку '= :bar' нам надо заменить на IS NULL, если значение 'bar' --- null, и на IN (?, ?, ..., ?), если в 'bar' находится массив.

Так вот, если заглянуть в файл грамматики для того же Постгреса (в мысклёвый не заглядывал, но думаю там что-то близкое), то можно увидеть:
Код:
/* Precedence: lowest to highest */
...
%right     '='
...
%nonassoc   IN_P
...
%nonassoc   NOTNULL
%nonassoc   ISNULL
%nonassoc   IS         /* sets precedence for IS NULL, etc */
то есть в результате наивной обработки запроса регексами мы можем получить запрос который, вообще говоря, не эквивалентен исходному (или синтаксически неправилен?)
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Я, например, не понял.
Ну это так, мысли вслух: если достаточно продвинутая библиотека подстановки значений захочет автоматически менять в запросе оператор равенства на оператор IS NULL или оператор IN в зависимости от типа подставляемого значения, то не надо забывать, что приоритет и ассоциативность у этих операторов разная.
 
  • Like
Реакции: AmdY

fixxxer

К.О.
Партнер клуба
достаточно продвинутая библиотека подстановки значений захочет автоматически менять
Не стоит такую магию городить, багодром гарантирован.

IS (NOT) NULL - это довольно особый случай, в 99% случаев туда и подставлять ничего не надо. А если надо, в обсуждаемой библиотеке это выносится в отдельный вызов parse. А вообще это одна из причин, почему я предпочитаю использовать для построения sql-запросов template engines. =)
 

riff

Новичок
Sad Spirit, Я пока ни за ни против, просто уточнить.
Добавив некий флаг, плейсхолдер будет обработан по особому?

(Так как я не понял "%!$@#", то) условно написав:
Код:
WHERE field = s:#value (вместо стандартного s:value)
    при value=null будет WHERE field IS NULL
    при value=array будет WHERE field IN (...)
в качестве такого флага, я сейчас написал #
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Sad Spirit, Я пока ни за ни против, просто уточнить.
Добавив некий флаг, плейсхолдер будет обработан по особому?
Ну да, либо с флагом, либо вообще автоматически. Не уверен, что видел где-либо автоматическую замену = на in(...), но вот автоматическая замена = на is [not] null таки есть в библиотеке yaff-db, которую я выше упомянул. Я просто несколько протупил, она здесь на форуме вроде не обсуждалась, мне Фанат в личку ссылку кидал.
 
Сверху