function CLI_squat_go() { while (true) { $lexeme = array('buy' => '[buy|kupi|kupiti|pokupay]', 'pen' => '[pen|pencil|ru4ka|ruchka]', 'tld' => '[ru|org|com|net]'); $default = (include OTHER_ROOT . '/generator.db'); $domain = generator('@rotate({[@buy|(0.3)]}{@pen}).@tld', $default + $lexeme); if (WhoIs::lookup($domain)) { } else { echo $domain, chr(10); } } }
<?php ## Исследуем yield. function generator() { echo "перед первым yield<br />"; (yield 1); echo "перед вторым yield<br />"; (yield 2); echo "перед третьим yield<br />"; (yield 3); echo "после третьего yield<br />"; } foreach (generator() as $i) { echo "{$i}<br />"; }
/** * Функция отправляет письма */ function sendMail() { // Явное указание на использование глобальных переменных global $localhostPath, $dbConnect, $prefix, $maxMailSend, $maxMailSendInDay, $log, $timeout; // Устанавливаем значение "по умолчанию" переменной статуса завершения функции $status = false; // Формирвоание текста сообщения о наличии файла "stop.txt" $stopFileExistlogMessage = date('d.m.Y H:i:s') . ": Выполнение предыдущей версии скрипта еще не завершено!"; // Формирвоание текста сообщения о наличии файла "gotLimit.txt" $gotlimitFileExistlogMessage = date('d.m.Y H:i:s') . ": Достигнут суточный лимит отправляемых писем. Рассылку необходимо возобновить вручную через 24 часа!"; // Если файла "gotLimit.txt" на сервере нет // Если файла "stop.txt" на сервере нет // Если соединение с БД установлено // И параметры скрипта переопределены // И максимальное количество отправляемых за раз писем не равно 0 if (!checkFileExists('gotLimit.txt', $gotlimitFileExistlogMessage) && !checkFileExists('stop.txt', $stopFileExistlogMessage) && dbConnect() && setParams() && $maxMailSend !== 0) { // Создаем файл "stop.txt" createFile('stop.txt', 'stop'); // Если есть активные почтовые рассылки, получаем параметры первой активной рассылки if ($mail = getMailingGroup()) { // Добавляем сообщение о начале работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Начало работы скрипта!"; // Получение списка адресатов, кому были отправлены письма $whoSent = $mail['whoSent'] ? explode(',', $mail['whoSent']) : array(); // Получаем массив категорий материалов рассылки $categories = $mail['categories'] ? array_diff(explode(',', $mail['categories']), array('', ' ', null)) : array(); // Получаем количество отправленных писем из отчера за предыдущий день $sendedYesterday = getYesterdayReportData(); // Определение количества отправленных писем $sendedInAllTime = $mail['log'] > count($whoSent) ? $mail['log'] : count($whoSent); // Подсчитываем, сколько еще можно отправить писем за этот день, не превышая лимитов хостинга $needToSend = $maxMailSendInDay + $sendedYesterday - $sendedInAllTime; // Переопределение максимального количества отправляемых за раз писем $maxMailSend = $needToSend >= $maxMailSend ? $maxMailSend : $needToSend; // Если не достигнут суточный лимит количества отправляемых писем if ($needToSend > 0) { // Получение списка подписчиков активной рассылки $subscribers = getSubscribers($categories, $mail['log']); // Если массив подписчиков не пуст if (!empty($subscribers)) { // Закрываем текущее соединение с БД, во избежание зазрыва соединения по таймауту mysql_close($dbConnect); // Обход массива подписчиков foreach ($subscribers as $subscriber) { // Если количество отправленных писем меньше максимального количества отправляемых писем за раз // И подписчику еще не отправлялось письмо if ($countMailSend < $maxMailSend && !in_array($subscriber['email'], $whoSent)) { // Установка временного интервала между отправками писем в 10 секунд sleep($timeout); // Определение значения по умолчанию сгенерированной строки, добавляемой к телу письма $generatorStr = ''; // Если параметр "Подключать словарь генерации случайного текста?" рассылки установлен в позицию "Да" if ($mail['generator'] == 1) { // Получение сгенерированной строки случайного текста $generator = generator(); // Если строка не сгенерирована if (!$generator) { // Переход к следующей итерации цикла continue; } // Добавляем сгенерированную строчку случайного текста $generatorStr = $generator; } /* --------- Генерация письма -------- */ // Тема письма $subject = $mail['subject']; // Формируем тело письма для отправки // Подставляем Имя пльзователя в тело в шаблон письма если есть маркер -{fio}- $body = str_replace('-{fio}-', $subscriber['fio'], $mail['textemail']); // Подставляем Email пльзователя в тело в шаблон письма если есть маркер -{fio}- $body = str_replace('-{email}-', $subscriber['email'], $body); // Добавление сгенерированной строки к телу письма $body .= $generatorStr; // Формируем заголовок письма $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: " . $mail['myemail'] . "\r\n"; $headers .= "Reply-To: " . $mail['myemail'] . "\r\n"; /* --------- Отправка письма -------- */ // Отправка письма адресату $sendingMail = mail($subscriber['email'], $subject, $body, $headers); /* --------- Проверка результата операции отправки -------- */ // Если письмо успешно отправлено if ($sendingMail) { // Добавляем E-mail адрес подписчика в массив адресатов, кому уже отправлены письма $whoSent[] = $subscriber['email']; // Формируем запрос на обновление списка отправленных у подписчика $updateSubscriberInfo[] = "(" . $subscriber['id'] . ", '" . addslashes($subscriber['downloadedDocs'] . "\r\n" . $mail['id'] . ". " . $mail['subject'] . " (" . date('H:i:s d.m.y') . ")") . "')"; $log[] = 'Письмо c id=' . $mail['id'] . ' успешно отправлено адресату ' . $subscriber['email']; } else { // Добавляем сообщение об ошибке в массив лога ошибок $log[] = 'Письмо c id=' . $mail['id'] . ' не отправлено на е-mail ' . $subscriber['email']; } // Удаление переменных unset($body, $subject, $header); // Увеличиваем общий счетчик отправленных писем на единицу $countMailSend++; } else { // Переход к следующей итерации цикла continue; } } // Формируем запрос в БД на обновление информации о рассылке $query = "UPDATE `" . $prefix . "subscribers_emails` SET `log`=" . ($mail['log'] + $countMailSend) . ", `whoSent`='" . implode(',', $whoSent) . "', `noteMail`='" . $mail['noteMail'] . "\r\n" . date('H:i:s d.m.Y') . ":Отправлено всего на " . count($whoSent) . " e-mail адресов' WHERE `id`=" . $mail['id']; } else { // Формируем запрос в БД на обновление информации о рассылке $query = "UPDATE `" . $prefix . "subscribers_emails` SET `log`=0, `published`=-1, `send_date`='" . date('Y-m-d H:i:s') . "', `whoSent`='" . implode(',', $whoSent) . "', `noteMail`='" . $mail['noteMail'] . "\r\n" . date('H:i:s d.m.Y') . ":Отправлено всего на " . count($whoSent) . " e-mail адресов' WHERE `id`=" . $mail['id']; } // Восстанавливаем отключенное ранее соединение с БД dbConnect(); // Отправка запроса в БД и получение результата $resultToDb = mysql_query($query, $dbConnect); // Если последняя операция MySQL вернула сообщение об ошибке (не пустую строку) if (!$resultToDb) { // Добавленеи сообщения об ошибках операции в MySQL в массив лога ошибок $log[] = "MySQL query error: " . mysql_error() . ' (' . $query . ')'; } // Если массив запросов на обновление списка отправленных материалов подписчику не пустой if ($updateSubscriberInfo) { // Преобразовываем массив в строку $updateSubscriberInfo = implode(',', $updateSubscriberInfo); // Формируем строку запроса в БД на внесение изменений в данные подписчиков в БД $updateSubscriberInfo = 'INSERT INTO `' . $prefix . 'subscribers` (`id`, `downloadedDocs`) VALUES' . $updateSubscriberInfo . ' ON DUPLICATE KEY UPDATE `downloadedDocs` = VALUES(`downloadedDocs`)'; // Отправка запроса в БД и получение результата $res = mysql_query($updateSubscriberInfo, $dbConnect); if (!$res) { // Добавленеи сообщения об ошибках операции в MySQL в массив лога ошибок $log[] = "MySQL query error: " . mysql_error() . ' (' . $query . ')'; } } } else { // Добавленеи сообщение о достижении суточного лимита в массив лога ошибок $log[] = "Достигнут суточный лимит отправляемых писем. Рассылка будет возобновлена завтра!"; // Проверяем, существует ли файл "dayReport.txt" на сервере if (file_exists($localhostPath . 'dayReport.txt')) { // Удаление файла "dayReport.txt" unlink($localhostPath . 'dayReport.txt'); } // Вызываем функцию создания файла отчета об общем количестве отправленных писем по текущей рассылке createFile('dayReport.txt', count($whoSent)); // Вызываем функцию создания файла createFile('gotLimit.txt', 'true'); } // Добавляем сообщение об окончании работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Завершение работы скрипта!"; } else { // Добавляем сообщение об окончании работы скрипта в массив лога $log[] = date('d.m.Y H:i:s') . ": Рассылка не ведется! Нет активных почтовых рассылок!"; } // Удаление файла "stop" unlink($localhostPath . 'stop.txt'); // Устанавливаем значение переменной статуса завершения функции $status = true; } // Закрываем текущее соединение с БД mysql_close($dbConnect); // Записываем логи в файл writeToLog(); // Завершаем выполнение работы скрипта. Выходим из функции return $status; }
<?php function generator() { (yield "A"); (yield "B"); (yield "C"); } foreach (generator() as $value) { echo $value, "\n"; }
<?php function generator() { echo (yield 5); echo (yield 6); } $gen = generator(); $current = $gen->current(); while ($gen->valid()) { $current = $gen->send($current * 2); }
if (@rename($dir_fs_document_root . $admin_dir_name, $dir_fs_document_root . 'admin' . $rand_str)) { $admin_dir_name = 'admin' . $rand_str; } } $enable_ssl = isset($_POST['ENABLE_SSL']) && $_POST['ENABLE_SSL'] == 'true' ? 'true' : 'false'; $http_cookie_domain = $_POST['HTTP_COOKIE_DOMAIN']; $http_cookie_path = $_POST['HTTP_COOKIE_PATH']; $http_url = parse_url(urldecode($_POST['HTTP_WWW_ADDRESS'])); $http_server = $http_url['scheme'] . '://' . $http_url['host']; $http_catalog = $http_url['path']; if (isset($http_url['port']) && !empty($http_url['port'])) { $http_server .= ':' . $http_url['port']; } // $http_server .= '/'; $https_server = $enable_ssl == 'true' ? str_replace('http://', 'https://', $http_server) : ''; $https_cookie_domain = $enable_ssl == 'true' ? $http_cookie_domain : ''; $https_cookie_path = $enable_ssl == 'true' ? $http_cookie_path : ''; if (substr($http_catalog, -1) != '/') { $http_catalog .= '/'; } // $http_catalog = ltrim($http_catalog, '/'); $file_contents = '<?php' . "\n" . '////////////////////////////////////////////////////////////////////////////////' . "\n" . '// project : XOS-Shop, open source e-commerce system' . "\n" . '// http://www.xos-shop.com' . "\n" . '//' . "\n" . '// filename : configure.php' . "\n" . '// author : Hanspeter Zeller <*****@*****.**>' . "\n" . '// copyright : Copyright (c) 2014 Hanspeter Zeller' . "\n" . '// license : This file is part of XOS-Shop.' . "\n" . '//' . "\n" . '// XOS-Shop is free software: you can redistribute it and/or modify' . "\n" . '// it under the terms of the GNU General Public License as published' . "\n" . '// by the Free Software Foundation, either version 3 of the License,' . "\n" . '// or (at your option) any later version.' . "\n" . '//' . "\n" . '// XOS-Shop is distributed in the hope that it will be useful,' . "\n" . '// but WITHOUT ANY WARRANTY; without even the implied warranty of' . "\n" . '// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' . "\n" . '// GNU General Public License for more details.' . "\n" . '//' . "\n" . '// You should have received a copy of the GNU General Public License' . "\n" . '// along with XOS-Shop. If not, see <http://www.gnu.org/licenses/>.' . "\n" . '////////////////////////////////////////////////////////////////////////////////' . "\n" . '' . "\n" . '// Define the webserver and path parameters' . "\n" . '// * DIR_FS_* = Filesystem directories (local/physical)' . "\n" . '// * DIR_WS_* = Webserver directories (virtual/URL)' . "\n" . ' define(\'HTTP_SERVER\', \'' . $http_server . '\'); // eg, http://localhost - should not be empty for productive servers' . "\n" . ' define(\'HTTPS_SERVER\', \'' . $https_server . '\'); // eg, https://localhost - should not be empty for productive servers' . "\n" . ' define(\'ENABLE_SSL\', \'' . $enable_ssl . '\'); // secure webserver' . "\n" . ' define(\'HTTP_COOKIE_DOMAIN\', \'' . $http_cookie_domain . '\');' . "\n" . ' define(\'HTTPS_COOKIE_DOMAIN\', \'' . $https_cookie_domain . '\');' . "\n" . ' define(\'HTTP_COOKIE_PATH\', \'' . $http_cookie_path . '\');' . "\n" . ' define(\'HTTPS_COOKIE_PATH\', \'' . $https_cookie_path . '\');' . "\n" . '' . "\n" . ' define(\'DIR_WS_CATALOG\', \'' . $http_catalog . '\');' . "\n" . ' define(\'DIR_WS_ADMIN\', DIR_WS_CATALOG . \'' . $admin_dir_name . '/\');' . "\n" . ' define(\'DIR_WS_IMAGES\', \'images/\');' . "\n" . ' define(\'DIR_WS_ICONS\', DIR_WS_IMAGES . \'icons/\');' . "\n" . ' define(\'DIR_WS_CATALOG_IMAGES\', DIR_WS_CATALOG . \'images/\');' . "\n" . ' define(\'DIR_WS_ADMIN_IMAGES\', DIR_WS_CATALOG . \'images/admin/templates/\');' . "\n" . ' define(\'DIR_WS_INCLUDES\', \'includes/\');' . "\n" . ' define(\'DIR_WS_BOXES\', DIR_WS_INCLUDES . \'boxes/\');' . "\n" . ' define(\'DIR_WS_FUNCTIONS\', DIR_WS_INCLUDES . \'functions/\');' . "\n" . ' define(\'DIR_WS_CLASSES\', DIR_WS_INCLUDES . \'classes/\');' . "\n" . ' define(\'DIR_WS_MODULES\', DIR_WS_INCLUDES . \'modules/\');' . "\n" . ' define(\'DIR_WS_DOWNLOAD_PUBLIC\', \'pub/\');' . "\n" . ' define(\'DIR_FS_DOCUMENT_ROOT\', \'' . $dir_fs_document_root . '\'); // where the pages are located on the server' . "\n" . ' define(\'DIR_FS_ADMIN\', DIR_FS_DOCUMENT_ROOT . \'' . $admin_dir_name . '/\'); // absolute pate required' . "\n" . ' define(\'DIR_FS_CATALOG\', DIR_FS_DOCUMENT_ROOT); // absolute path required' . "\n" . ' define(\'DIR_FS_BACKUP\', DIR_FS_ADMIN . \'backups/\');' . "\n" . ' define(\'DIR_FS_CATALOG_IMAGES\', DIR_FS_CATALOG . \'images/\');' . "\n" . ' define(\'DIR_FS_CATALOG_MODULES\', DIR_FS_CATALOG . \'includes/modules/\');' . "\n" . ' define(\'DIR_FS_DOWNLOAD\', DIR_FS_CATALOG . \'download/\');' . "\n" . ' define(\'DIR_FS_DOWNLOAD_PUBLIC\', DIR_FS_CATALOG . \'pub/\');' . "\n" . ' define(\'DIR_FS_SMARTY\', DIR_FS_CATALOG . \'smarty/\');' . "\n" . ' define(\'DIR_FS_TMP\', DIR_FS_ADMIN . \'tmp/\');' . "\n" . '' . "\n" . ' define(\'ADMIN_DIR_NAME\', \'' . ($admin_dir_name === 'admin' ? 'default_dir_name' : $admin_dir_name) . '\');' . "\n" . '' . "\n" . ' define(\'KEY\', \'' . generator(60) . '\');' . "\n" . '' . "\n" . '// define our database connection' . "\n" . ' define(\'DB_SERVER\', \'' . $_POST['DB_SERVER'] . '\'); // eg, localhost - should not be empty for productive servers' . "\n" . ' define(\'DB_SERVER_USERNAME\', \'' . $_POST['DB_SERVER_USERNAME'] . '\');' . "\n" . ' define(\'DB_SERVER_PASSWORD\', \'' . $_POST['DB_SERVER_PASSWORD'] . '\');' . "\n" . ' define(\'DB_DATABASE\', \'' . $_POST['DB_DATABASE'] . '\');' . "\n" . ' define(\'USE_PCONNECT\', \'' . ($_POST['USE_PCONNECT'] == 'true' ? 'true' : 'false') . '\'); // use persistent connections?' . "\n" . ' define(\'STORE_SESSIONS\', \'' . ($_POST['STORE_SESSIONS'] == 'files' ? '' : 'mysql') . '\'); // leave empty \'\' for default handler or set to \'mysql\'' . "\n" . '?>'; $fp = fopen($dir_fs_document_root . 'includes/configure.php', 'w'); fputs($fp, $file_contents); fclose($fp); @chmod($dir_fs_document_root . 'includes/configure.php', 0644); $smarty->assign(array('href_link_catalog' => $http_server . $http_catalog . 'index.php?lnc=' . $_POST['language_code'], 'href_link_admin' => $http_server . $http_catalog . $admin_dir_name . '/index.php?lnc=' . $_POST['language_code'])); } $output_install_6 = $smarty->fetch('install_6.tpl'); $smarty->clearAssign(array('form_begin', 'form_end', 'db_error', 'dir_fs_document_root', 'admin_dir_name', 'href_link_catalog', 'href_link_admin', 'href_link_index', 'hidden_fields')); $smarty->assign('install_inner_content', $output_install_6);
< html > < body > < h1 > generator_test.php < /h1 > <?php require_once 'otp.php'; require_once 'random_utils.php'; require_once 'nutils.php'; echo "Generator Test", "<BR><BR>"; $time1 = time(); $result = generator(); $time2 = time(); echo "<BR>"; echo "elapsed time = ", $time2 - $time1, " seconds.<BR>"; echo "Generated ", count($result), " user OTP's<BR>"; echo "<BR>"; echo "Result of applying hash to OTP #1 (", $result[0], ")<BR>"; echo "hex version of OTP #1 = ", ivcs_transform_from(explode(" ", $result[0])), "<BR>"; //echo "hash of ",strtolower(ivcs_transform_from(explode(" ",$result[0])))," = " , __cn_hash(sha1(strtolower(ivcs_transform_from(explode(" ",$result[0]))))),"<BR>"; echo "hash of ", ivcs_transform_from(explode(" ", $result[0])), " = ", __cn_hash(sha1(ivcs_transform_from(explode(" ", $result[0])))), "<BR>"; echo "<BR>symmetry test<BR>"; echo "1st OTP from generator = ", $result[0], "<BR>"; $hex = ivcs_transform_from(explode(" ", $result[0])); echo "Hex result from ivcs_transform_from = ", $hex, "<BR>"; $six = ivcs_transform_to($hex); echo "Re-encoding result from ivcs_transform_to ", implode(" ", $six), "<BR>"; echo "<BR>"; echo "<BR>"; echo "Test of OTP table : <BR>"; $index = 1; $lastHash = __cn_hash(sha1(ivcs_transform_from(explode(" ", $result[0])))); $numfailed = 0;
print "<p class=\"er\">" . $lang['er_05'] . "</p>"; } elseif (preg_match("/^[a-z0-9_.-]{1,20}@(([a-z0-9-]+\\.)+(com|net|org|mil|edu|gov|arpa|info|biz|[a-z]{2})|[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3})\$/is", $email)) { $sql = 'SELECT `login`, `pass`, `status` FROM `users` WHERE `mail` = "' . $email . '" AND `login` = "' . $ulogin . '" LIMIT 1'; $rs = mysql_query($sql); $a = mysql_fetch_array($rs); $s = $a['status']; if (!$a) { print '<p class="er">' . $lang['er_06'] . '</p>'; } else { $case1 = on; $case2 = on; $case3 = on; $case4 = off; $num1 = 8; $num2 = 1; $newpass = generator($case1, $case2, $case3, $case4, $num1); $text = "<p>Здравствуйте <b>" . $a['login'] . "</b>!</p><p>По Вашей просьбе высылаем новый пароль к аккаунту " . $a['login'] . "<br /><p>Новый пароль: <b>" . $newpass . "</b></p>С Уважением, администрация проекта " . $cfgURL . "<hr /><p>Hello <b>" . $a['login'] . "</b>!</p><p>At your request, send new password to your account " . $a['login'] . "<br /><p>New password: <b>" . $newpass . "</b></p>Sincerely, Administration project <a href=\"http://" . $cfgURL . "\">" . $cfgURL . "</a>"; $subject = "New password / Новый пароль"; $headers = "From: " . $adminmail . "\n"; $headers .= "Reply-to: " . $adminmail . "\n"; $headers .= "X-Sender: < http://" . $cfgURL . " >\n"; $headers .= "Content-Type: text/html; charset=windows-1251\n"; mysql_query("UPDATE `users` SET pass = '******' WHERE login = '******'login'] . "' LIMIT 1"); if (mail($email, $subject, $text, $headers)) { print '<p class="erok">' . $lang['er_07'] . '</p>'; } else { print '<p class="er">' . $lang['er_08'] . '</p>'; } } } else { print '<p class="er">' . $lang['er_09'] . '</p>';
<section class="row"> <h1 class="text-center">POO avancée en PHP - Les générateurs - valeurs retournées</h1> <p>Retourner des valeurs avec yield</p> <!-- Les générateurs ================================================== --> <h2>Retourner des clés avec valeurs</h2> <p class="col-sm-12"> <?php function generator() { for ($i = 0; $i < 10; $i++) { (yield 'Itération n°' . $i); } } foreach (generator() as $key => $val) { echo $key . ' => ' . $val . '<br>'; } ?> </p> <h2>Modifier la clé associée à la valeur</h2> <p class="col-sm-12"> <?php function generator2() { (yield 'a' => 'Itération 1'); (yield 'b' => 'Itération 2'); (yield 'c' => 'Itération 3'); (yield 'd' => 'Itération 4');
<?php ## Использование return в генераторе. function generator() { (yield 1); return yield from two_three(); (yield 5); } function two_three() { (yield 2); (yield 3); return 4; } $generator = generator(); foreach ($generator as $i) { echo "{$i}<br />"; } echo "return = " . $generator->getReturn();
public function testGenerator() { $go = function ($str) { return generator($str); }; $this->assertEquals($go('[]'), ''); $this->assertEquals($go('ab'), 'ab'); $this->assertEquals($go('[a]'), 'a'); $this->assertEquals($go('[a][b]'), 'ab'); $this->assertEquals($go('[a[b]][c]'), 'abc'); $this->assertTrue(!!preg_match('~^a|b$~', $go('a|b'))); $this->assertTrue(!!preg_match('~^a|b|c$~', $go('a|b|c'))); $this->assertTrue(!!preg_match('~^a[bc]$~', $go('a[b|c]'))); $this->assertTrue(!!preg_match('~^(a|b) (1|2)$~', $go('[a|b] [1|2]'))); foreach (range(1, 1000) as $_) { $this->assertTrue(!!preg_match('~^(a|b|c) (x|y|z|(X|Y|Z)) (1|2|3)$~', $go('[a|b|c] [x|y|z|[X|Y|Z]] [1|2|3]'))); } $check = array(); foreach (range(1, 100000) as $_) { $this->assertTrue(!!preg_match('~^(a|b|c|)$~', $__ = $go('[a(7)|b|c|]'))); $check[$__] = (isset($check[$__]) ? $check[$__] : 0) + 1; } $sum = array_sum($check); array_walk($check, function (&$_) use($sum) { $_ = round($_ / $sum, 1); }); $this->assertTrue($check['a'] === 0.7); $this->assertTrue($check['b'] === 0.1); $this->assertTrue($check['c'] === 0.1); $this->assertTrue($check[''] === 0.1); // // // $_ = $go("[a|b](2)"); $this->assertTrue($_ === "ab" or $_ === "ba"); $_ = $go("[a(0)|b](2)"); $this->assertTrue($_ === "b"); $check = array(); foreach (range(1, 100000) as $_) { $__ = $go('[a(9)|b](2)'); $check[$__] = (isset($check[$__]) ? $check[$__] : 0) + 1; } $sum = array_sum($check); array_walk($check, function (&$_) use($sum) { $_ = round($_ / $sum, 1); }); $this->assertTrue($check['ab'] === 0.9); $this->assertTrue($check['ba'] === 0.1); }
* Date: 2015/06/26 * Time: 2:21 PM */ /** * @param int $start * @param int $end * @param int $step * @return Generator */ function generator($start, $end, $step = 1) { for ($i = $start; $i <= $end; $i += $step) { (yield 'name' . $i); } } $coroutine = generator(1, 2); xdebug_debug_zval('coroutine'); $valid = $coroutine->valid(); xdebug_debug_zval('valid'); $coroutine->rewind(); $current = $coroutine->current(); xdebug_debug_zval('current'); $valid = $coroutine->valid(); xdebug_debug_zval('valid'); $coroutine->next(); $current2 = $coroutine->current(); xdebug_debug_zval('current2'); $valid = $coroutine->valid(); xdebug_debug_zval('valid'); $coroutine->next(); $current3 = $coroutine->current();
<?php function generator() { (yield 10); (yield "key" => "value"); yield; } $iterator = generator(); foreach ($iterator as $key => $value) { echo "{$key} -> {$value}" . PHP_EOL; } // reference generator function &referenceGenerator() { $value = 1; $index = 0; while ($index < 5) { (yield $value); $index++; echo $value . PHP_EOL; } } $referenceIterator = referenceGenerator(); // used with & foreach ($referenceIterator as &$value) { $value += $value; }
function generator2() { (yield 2); (yield 3); yield from generator(); }
function coursematch($courselist, $num, $darr, $conn) { if (empty($courselist)) { return array(); } $masterarr = array(); function addMaster($array, &$master) { //print_r($array); $master[] = $array; } function check($con1, $con2) { foreach ($con1 as $a) { foreach ($con2 as $b) { if ($a->conflictBool($b) && $a->sameDay($b)) { return 0; } } } return 1; } //check using user preferences //$time: 9,10,11,12 //days is an array in the style "M T W Th F S" function checkPref($con1, $con2, $time, $days) { foreach ($con1 as $a) { if (convertToMin($a->time_start) < $time * 60) { return 0; } //checks required days with days in classes foreach (str_split($a->days) as $day) { foreach (str_split($days) as $day2) { if ($day == $day2) { return 0; } } } } foreach ($con2 as $b) { if (convertToMin($b->time_start) < $time * 60) { return 0; } //checks required days with days in classes foreach (str_split($b->days) as $day) { foreach (str_split($days) as $day2) { if ($day == $day2) { return 0; } } } } return 1; } $queue = array(); $index = 1; $count = count($courselist); $queue[] = generator($courselist[0], $conn); $iterations = array(1); while (!empty($queue)) { if ($index < $count) { $curr = generator($courselist[$index], $conn); $iterations[$index] = 0; for ($a = 0; $a < $iterations[$index - 1]; $a++) { foreach ($queue[0] as $con1) { array_shift($queue); foreach ($curr as $con2) { if (check($con1, $con2) && checkPref($con1, $con2, $num, $darr)) { $newArr = array(); foreach ($con1 as $elem1) { $newArr[] = $elem1; } foreach ($con2 as $elem2) { $newArr[] = $elem2; } $newIteration = array($newArr); $queue[] = $newIteration; $iterations[$index]++; } } } } } else { for ($a = 0; $a < $iterations[$index - 1]; $a++) { if (!empty($queue[0])) { addMaster($queue[0], $masterarr); array_shift($queue); } } } $index++; } //print_r($masterarr); return $masterarr; }