http://localhost:8000/api
docker run -p 8000:8000
http://centrifugo:8000/api
<?php
use OpenSwoole\WebSocket\Server;
use OpenSwoole\Http\Request;
use OpenSwoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("Start", function(Server $server)
{
echo "OpenSwoole WebSocket Server is started at http://127.0.0.1:9502\n";
});
$server->on('Open', function(Server $server, OpenSwoole\Http\Request $request)
{
echo "connection open: {$request->fd}\n";
$server->tick(1000, function() use ($server, $request)
{
$server->push($request->fd, json_encode(["hello", time()]));
});
});
$server->on('Message', function(Server $server, Frame $frame)
{
echo "received message: {$frame->data}\n";
$server->push($frame->fd, json_encode(["hello", time()]));
});
$server->on('Close', function(Server $server, int $fd)
{
echo "connection close: {$fd}\n";
});
$server->on('Disconnect', function(Server $server, int $fd)
{
echo "connection disconnect: {$fd}\n";
});
$server->start();
cmd + F2
(на маке) выделит все включения текущего слова. Мульти-курсор, можно заменить или допечатать/удалить часть – везде и сразу ©cmd + shift + P
и начать печатать "Emmet: Balance (inward)" – и выбрать команду$keys = ['sku', 'brand', 'City1', 'City2'];
$setKeys = function ($values) use ($keys) {
return array_combine($keys, $values);
};
$data = [ [1,2,3,4], [11,22,33,44], ];
$result = array_map($setKeys, $data);
Array
(
[0] => Array
(
[sku] => 1
[brand] => 2
[City1] => 3
[City2] => 4
)
[1] => Array
(
[sku] => 11
[brand] => 22
[City1] => 33
[City2] => 44
)
)
name
Например<input type="text" name="first_name" placeholder="First name">
<select name="day_of_week">
<option value="1">Monday</option>
<option value="2">Tuesday</option>
<option value="3">Wednesday</option>
</select>
<?php
$filename = 'form_responses.txt';
if (!empty($_POST)) {
$record = [
// перечисляются поля формы
'first_name' => filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING),
'day_of_week' => filter_input(INPUT_POST, 'day_of_week', FILTER_SANITIZE_NUMBER_INT),
];
$recordString = implode('; ', $record) . PHP_EOL; // склеить значения через точку с запятой
file_put_contents($filename, $recordString, FILE_APPEND);
}
??
$field1 = 'Habr';
$field2 = 'QnA';
$array = [
'id' => $data->xxx->yyy->id ?? null,
'name' => $data->{'name'} ?? 'untitled',
'site' => $data->$field1->$field2 ?? 'поиск';
];
если запрошенного поля нет, ошибку не бросает, а берет значение по умолчанию, которое после ??
tv-symbol-price-quote__value js-symbol-last
там — пустой. Это после обработки в браузере JS, в тот элемент попадает обновляемое значение котировки.array()
на []
Создаёт массив с единственным элементом. И присваивает его в$options[$k] = [$row['value']]; // то же самое, что $options[$k] = array($row['value']);
$options[$k]
$arr1 = [ 1, 2, 3 ];
// то же самое, что
$arr1 = array(1, 2, 3);
$arr2 = [
'Habr' => 'QnA',
'Stack' => 'Overflow',
];
// то же самое, что
$arr2 = array(
'Habr' => 'QnA',
'Stack' => 'Overflow',
);
$args = [
'name1' => FILTER_SANITIZE_STRING,
'age1' => FILTER_SANITIZE_NUMBER_INT,
'weight1' => FILTER_SANITIZE_NUMBER_FLOAT,
];
$defaults = [
"name1" => "по умолчанию",
"age1" => "по умолчанию",
"weight1" => "по умолчанию",
];
$results = array_merge($defaults, filter_input_array(INPUT_GET, $args));
// вывод
foreach ($results as $name => $value) {
printf('<p>%s: %s</p>', $name, $value);
}
$options = [
[null, $_LNG['TYPE_ORDER']],
['select_all', $_LNG['ALL_TYPES']],
['select_domain', $_LNG['DOMAIN']],
['select_server', $_LNG['SERVER']],
['select_ssl', $_LNG['SSL']],
['select_desing', $_LNG['DESING']],
['select_script', $_LNG['SCRIPT']],
['select_layout', $_LNG['LAYOUT']],
['select_adv', $_LNG['ADV']],
['select_seo', $_LNG['SEO']],
];
printf('const options = %s;', json_encode($options));
options
полноценный элемент select
со всеми опциями: createSelect = () => {
const select = document.createElement('select');
options.forEach(([value, title]) => {
const option = document.createElement('option');
option.innerText = title;
if (value) {
option.value = value;
} else {
option.setAttribute('disabled', true);
option.setAttribute('selected', true);
}
select.appendChild(option);
});
return select;
};
0.25
как ни округляй, будет 0
для $amount < 2
$rand = mt_rand(1, 1000);
$bad = '...';
if ($rand < 150) {
$k = 1;
$message = '$ (x0) ❌';
} elseif ($rand < 300) {
$k = 0.75;
$message = "$ (x0.25) $bad";
} elseif ($rand < 450) {
$k = 0.5;
$message = "$ (x0.5) $bad";
} elseif ($rand < 600) {
$k = 0.25;
$message = "$ (x0.75) $bad";
}
$delta = round($amount * k);
$res = $user->balance - $delta;
$restxt = 'Вы проиграли ' . number_format($delta, 0, '', '.') . $message;
$delta = $amount === 1 ? max(1, floor($amount * k)) : floor($amount * $k);
но следующий вопрос будет «а вот 2 при $k === 0.25
тоже округляется до 0» $start = new DateTimeImmutable('1878-10-11');
$finish = new DateTimeImmutable('2009-10-13');
$interval = $start->diff($finish);
$daysDiff = $interval->format('%a');
$randomDays = rand(0, $daysDiff);
$randomDate = $start->add(new DateInterval("P${randomDays}D"));
echo $randomDate->format('Y-m-d'); // 1896-06-24
.htaccess
в конфиг NGINX. С помощью Google, SO и Habr.QnA )/index.php
, а там уже логика внутри PHP узнавала запрошенный URL /section1/page2
и отдавала соответствующий ответ. Такие решения универсальны относительно веб-сервера..htaccess
иногда кладут в проект, потому, что это легкий невидимый файл, который не помешает. Но поможет понять ожидаемое поведение веб-сервера. Конфиги NGINX лежат отдельно от проекта, поэтому их не прилагают. Хотя иногда приводят пример в документации.