PHP задачи с собеседований
3.05K subscribers
475 photos
6 videos
11 files
360 links
Задачи, тесты и теоретические вопросы по PHP.

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
👨🏻‍💻 Блокирование файла сессии Laravel

В проекте на Laravel 7 иногда вываливается ошибка upstream timed out (110: Unknown error) while reading response header from upstream Сам сайт отдает при этом ошибку 504. Перебирая пошагово на каком этапе возникает проблема, пришел к тому, что в Middleware StartSession есть такая проверка на доступность сессии:

$session = $this->getSession($request);
if ($this->manager->shouldBlock() || ($request->route() && $request->route()->locksFor())) {
return $this->handleRequestWhileBlocking($request, $session, $next);
} else {
return $this->handleStatefulRequest($request, $session, $next);
}

Если изменить драйвер на Coockie, то проблема пропадает, но использовать куки в качестве хранилища не вариант, как и БД. Проблема возникает если использовать в качестве драйвера и file и redis. Есть ли какое-то решение этой проблемы?

PHP задачи с собеседований
👨🏻‍💻 Реальная проблема реального человека

Необходимо на php реализовать расчет гамма-функции

Задачка переводится с excel на yii2. Нужно на php рассчитывать Гамма функцию. В модуле stats вроде есть функция stats_cdf_gamma. Но пока не могу понять что там за входящие параметры(3шт.), в excel всего один параметр: гамманлог(х). Как-то в статистике и высшей математике не силен. Поскажите, можно ли будет использовать указанную функцию, или как-то подцепить ёкселевские функции или ещё какой вариант.

PHP задачи с собеседований
👎2
👨🏻‍💻 Как отправить headers на localhost Laravel?

В доках нужно ставить полный путь на сайт но так же не найдет:

$response = Http::withToken($token)->post('http://localhost/api/auth/logout');

а так он не знает сайт

$response = Http::withToken($token)->post('api/auth/logout');

PHP задачи с собеседований
👎1
👨🏻‍💻 Как выбрать элемент с указанным шансом?

Есть данный массив:

Array ( [cost] => 1475.00 [case] => sharp [chance] => 0.47864506627393 ) 
Array ( [cost] => 1399.00 [case] => sharp [chance] => 0.51546391752577 )
Array ( [cost] => 1600.00 [case] => sharp [chance] => 0.44182621502209 )
Array ( [cost] => 1478.00 [case] => sharp [chance] => 0.47864506627393 )
Array ( [cost] => 1050.00 [case] => sharp [chance] => 0.68114874815906 )
Array ( [cost] => 309.00 [case] => sharp [chance] => 2.319587628866 )
Array ( [cost] => 279.00 [case] => sharp [chance] => 2.5773195876289 )
Array ( [cost] => 93.00 [case] => sharp [chance] => 7.7135493372607 )
Array ( [cost] => 109.00 [case] => sharp [chance] => 6.5905743740795 )
Array ( [cost] => 130.00 [case] => sharp [chance] => 5.5228276877761 )
Array ( [cost] => 23.00 [case] => sharp [chance] => 10.861561119293 )
Array ( [cost] => 29.00 [case] => sharp [chance] => 13.696612665685 )
Array ( [cost] => 31.00 [case] => sharp [chance] => 14.635493372607 )
Array ( [cost] => 109.00 [case] => sharp [chance] => 6.5905743740795 )
Array ( [cost] => 2.42 [case] => sharp [chance] => 1.1413843888071 )
Array ( [cost] => 5.39 [case] => sharp [chance] => 2.540500736377 )
Array ( [cost] => 24.00 [case] => sharp [chance] => 11.321796759941 )
Array ( [cost] => 10.00 [case] => sharp [chance] => 4.7128129602356 )
Array ( [cost] => 13.00 [case] => sharp [chance] => 6.1303387334315 )
Array ( [cost] => 0.60 [case] => sharp [chance] => 0.27614138438881 )
Array ( [cost] => 0.60 [case] => sharp [chance] => 0.27614138438881 )
Array ( [cost] => 0.60 [case] => sharp [chance] => 0.27614138438881 )
Array ( [cost] => 0.12 [case] => sharp [chance] => 0.055228276877761 )
Array ( [cost] => 0.12 [case] => sharp [chance] => 0.055228276877761 )
Array ( [cost] => 0.12 [case] => sharp [chance] => 0.055228276877761 )
Array ( [cost] => 0.12 [case] => sharp [chance] => 0.055228276877761 )

Сумма элемента chance равна 100%, то есть в chance указан шанс выпадения в %, какой наиболее лучший способ будет чтобы выбирать элемент из массива с указанным шансом?

Мне в голову приходить только домножение на N и выбор с помощью rand(1, 100 * N), но не думаю что данный способ является корректным.

PHP задачи с собеседований
👍5
👨🏻‍💻 Ошибка bcdiv(): Argument #1 ($num1) is not well-formed

Помогите пожалуйста пофиксить данную ошибку

Данные приходят с внешнего api в float формате, цель сделать из float строку и обрезать в конце нули (чтобы также прогонять подобные строки '0.5450000' => '0.545')

<?php
function to_string($value, $fix = 12) {
$string = bcdiv($value, 1, $fix);
return $string = $fix > 0 ? rtrim(rtrim($string, '0'), '.') : $string;
}

$result = to_string(1.5);
echo gettype($result) .' '. $result; // string 1.5

$result = to_string(1.0E-6); // Ошибка bcdiv(): Argument #1 ($num1) is not well-formed
echo gettype($result) .' '. $result;

PHP задачи с собеседований
👨🏻‍💻 Реальная проблема реального человека

Как здесь правильно исползовать language?

Я новичок здесь и не знаю, почему это показывает, так ☺️

Устарело: создание динамического свойства Language::$languages устарело в C:\xampp\htdocs\test\class.Language.php в строке 8

function detectLanguage()
{
global $DEFAULT_LANGUAGE;
if ($_SERVER['HTTP_ACCEPT_LANGUAGE']) {
$this->languages = $_SERVER['HTTP_ACCEPT_LANGUAGE']; /*Здесь ошибка*/
$this->language = substr($this->languages, 0, 2); /* И Здесь ошибка*/
return $this->language;
} else if ($_SERVER['HTTP_USER_AGENT']) {
$this->user_agent = explode(";", $_SERVER['HTTP_USER_AGENT']);

for ($i = 0; $i < sizeof($this->user_agent); $i++) {
$this->languages = explode("-", $this->user_agent[$i]);
if (sizeof($this->languages) == 2) {
if (strlen(trim($this->languages[0])) == 2) {
$size = sizeof($this->language);
$this->language[$size] = trim($this->languages[0]);
}
}
}
return $this->language[0];
} else {
$this->language = $DEFAULT_LANGUAGE;
return $this->language;
}
}

PHP задачи с собеседований
👍1
👨🏻‍💻 Не получается создать проект на PHP Laravel

При создании проекта на Laravel возникает ошибка:

Problem 1 - laravel/framework[v10.10.0, ..., v10.12.0] require league/flysystem ^3.8.0 -> satisfiable by league/flysystem[3.8.0, ..., 3.15.1]. - league/flysystem[3.3.0, ..., 3.14.0] require league/mime-type-detection ^1.0.0 -> satisfiable by league/mime-type-detection[1.0.0, ..., 1.11.0]. - league/flysystem[3.15.0, ..., 3.15.1] require league/flysystem-local ^3.0.0 -> satisfiable by league/flysystem-local[3.15.0]. - league/mime-type-detection[1.0.0, ..., 1.3.0] require php ^7.2 -> your php version (8.2.6) does not satisfy that requirement. - league/mime-type-detection[1.4.0, ..., 1.11.0] require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension. - league/flysystem-local 3.15.0 require ext-fileinfo * -> it is missing from your system. Install or enable PHP's fileinfo extension. - Root composer.json requires laravel/framework ^10.10 -> satisfiable by laravel/framework[v10.10.0, v10.10.1, v10.11.0, v10.12.0]. To enable extensions, verify that they are enabled in your .ini files: - C:\Program Files\PHP\php.ini You can also run php --ini in a terminal to see which files are used by PHP in CLI mode. Alternatively, you can run Composer with --ignore-platform-req=ext-fileinfo to temporarily ignore these required extensions.

Версия PHP: 8.2.6

PHP задачи с собеседований
👎1
👨🏻‍💻 Почему The command \"passport:install\" does not exist.?

при запуске приложения

php artisan passport:install

в консоли все выполняется

а когда хочу чтобы эта команда сработала так то выдает ошибку

Route::post('/cli-passport-install', function () {
Illuminate\Support\Facades\Artisan::call('passport:install');

return new Illuminate\Http\JsonResponse([], 204);
});

PHP задачи с собеседований
👍2
👨🏻‍💻 Как исключить добавление ключа внутри объявления массива при определенных условий?

Можно ли как то исключить добавление ключа внутри объявления массива при определенных условий?

<?php
$array = [];

foreach ($orders as $order) {
$array[] = [
'account-id' => $order['account_id'],
'price' => $order['price'], // если $order['price'] === '0' то исключить этот ключ
'amount' => $order['amount'],
// Ключей и значений много и много подобных проверок
];
}

$request = $this->request($this->api_host .'v1/order', 'POST', $array);

Ниже пример, пробовал делать так, но там очень много подобных значений, как итог вариант не подходит:

<?php
$array = [];

foreach ($orders as $order) {
if ($order['price'] === '0') {
$array[] = [
'account-id' => $order['account_id'],
'amount' => $order['amount'],
];
} else {
$array[] = [
'account-id' => $order['account_id'],
'price' => $order['price']
'amount' => $order['amount'],
];
}
}

$request = $this->request($this->api_host .'v1/order', 'POST', $array);

PHP задачи с собеседований
👨🏻‍💻 Как вывести остальные элементы из таблицы в БД MySql?

Проблема лишь в том, что выводит последний элемент из таблицы "ingredient", а первый игнорирует, не могу понять как отобразить его на экране в <Input>.

У меня есть таблица, которая связана с другой, и когда я вывожу элементы с индексом 1 (у меня две записи с индексом 1, и одна запись с индексом 2), он выбирает последний с индексом 1 и выводит его.

Как вывести первый элемент? Я пытался сделать это методом explode, но так получается, что у обоих записей меняется ключ на 0.

<?php $sql = "SELECT * FROM `Ingredient` WHERE id_ingr = '1'";
if($result = $conn2->query($sql)){
foreach($result as $row ){

$ingredient = $row['ingredient'];
}
}


?>
<input type="checkbox" class="checkbox" name ="checkboxx[]" value="<?php $ingredient?>" id="checkbox1" checked/><label class="label" for="checkbox1"><?php echo $ingredient ;?></label>

PHP задачи с собеседований
PHP Academy — в телеграм!

PHP - один из самых популярных языков веба, он применяется в более чем 40% всех сайтов мира и достаточно прост в освоении.

Вывести свои навыки веб-разработки на новый уровень на практике, помогут авторы канала, которые пишут код, изучают библиотеки за вас и дают резюме, собирают бесплатные книги и курсы по PHP и делятся с подписчиками.

Стоит подписаться: @phpshka
👍5🔥1🎉1
👨🏻‍💻 Не получается отловить исключение при валидации Codeigniter 4

Отправляю json методом post на контроллер через curl. В контроллере написано следующее:

try
{
$input = $this->request->getJSON(true);
$this->validation->setRules([
'arrayValues.*.someId' => 'trim|required|string'
]);
$this->validation->run($input);
}
catch (\Exception $e)
{
$result = false;
}

Ожидаемый верный декодированный массив:

$decodedArray = ['arrayValues' => [['someId' => 'qwe'],['someId' => 'ewq']]];

В результате выполнения получаю ошибку внутри блока try/catch и в блок catch не переходит.

Это происходит если приходят данные, не во вложенном массиве:
"Argument 2 passed to _array_search_dot() must be of the type array, string given, called in /codeigniter/system/Helpers/array_helper.php on line 56:

$decodedArray = ['arrayValues' => ['someId' => 'qwe']];

Если приходит пустой массив, то получаю ошибку

/codeigniter/system/Validation/Validation.php(266): trim() -> trim() expects parameter 1 to be string, array given, но она ловится в try/catch нормально.

$decodedArray = ['arrayValues' => []];

Почему такое происходит и как от этого избавиться?

PHP задачи с собеседований
👨🏻‍💻 Не читает поля из файла XML

К тегу <Ид> не возможно обратится, скорее всего из-за кириллицы. Как можно исправить проблему или ее тут нет и мне нужно отдохнуть? <?php include 'unicode.inc';

$xml_file = 'test.xml';
$xml = simplexml_load_file($xml_file);
$xml="<?xml version='1.0' encoding='UTF-8'?>



// Приводим значения полей тега <Ид> к числовым значениям
$ids = [];
foreach ($xml->('Ид') as $id) {
$numeric_id = preg_replace('/[0-9]/', ' ', $id);
$id[0] = intval($numeric_id);
$ids[] = $id;
}

// Сохраняем изменения в новом файле
$date = date('Y-m-d');
$output_file = "test-$date.xml";
$xml->asXML($output_file);

echo "Файл $output_file успешно создан\n";
?>

PHP задачи с собеседований
👍6
👨🏻‍💻 Я пытаюсь получить данные из таблицы MySQL, но вылезает одна из этих ошибок:

mysql_fetch_array() expects parameter 1 to be resource, boolean given

или

mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given

Вот мой код:

$username = $_POST['username'];
$password = $_POST['password'];
$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE $username");

while($row = mysql_fetch_array($result))
{
echo $row['FirstName'];
}

Кто-нибудь знает, как решить эту проблему?
PHP задачи с собеседований
👎3
👨🏻‍💻Изминения значение параметра в url по нажатию на ссылку

У меня есть такая таблица:

echo "<table border='1'>";
echo "<tr>
<th><a href='?sort=1&direction=1'>Название продукта</a></th>
<th><a href='?sort=2&direction=1'>Цена в грн</a></th>
<th><a href='?sort=3&direction=1'>Количество (кг/шт)</a></th>
<th><a href='?sort=4&direction=1'>Стоимость в грн</a></th>
<th>Действие</th>
</tr>";

Мне нужно по нажатию на ссылку, что бы менялся параметр direction на 0 или 1. Считать значение direction я могу, но как правильно изменить и записать его новое значение - в этом проблема.

PHP задачи с собеседований
👨🏻‍💻 Получаю такую ошибку.

Пробовал - Curl error 60, SSL certificate issue: self signed certificate in certificate chain ,не помогло.
Может кто сталкивался ? Сижу час - ломаю голову. Поменял сертификат, запускаю без apache,через php artisan serv.

PHP задачи с собеседований
👎4
👨🏻‍💻 Аннотация Psalm для типа возвращаемого значения в месте вызова метода/функции

Для демонстрации проблемы есть такой упрощенный реальный код:

abstract class A
{
/**
* @var array<string, mixed>
*/
private array $params;

public function __construct(array $params)
{
static::validateParams($params);
$this->params = $params;
}

final protected function getParamByKey(string $key): mixed
{
return $this->params[$key];
}

/**
* @throws \InvalidArgumentException
*/
abstract protected static function validateParams(array $params): void;
}

final class B extends A
{
protected static function validateParams(array $params): void
{
if (!is_string($params['X'])) {
throw new \InvalidArgumentException('Param X must be string');
}
if (!is_int($params['Y'])) {
throw new \InvalidArgumentException('Param Y must be int');
}
}

public function getParamX(): string
{
return $this->getParamByKey('X');
}

public function getParamY(): int
{
return $this->getParamByKey('Y');
}
}

Теперь к сути. При прогоне этого кода через psalm для методов B::getParamX и B::getParamY я получаю по два варнинга: MixedReturnStatement: Could not infer a return type и MixedInferredReturnType: Could not verify return type 'string' for.

Понятно что причина в том, что в объявлении метода getParamByKey, mixed указан как тип возвращаемого значения, из-за чего psalm делает вывод, что в B::getParamX и B::getParamY могут прилететь данные любого типа. Только вот в действительности это не так, поскольку перед вызовами B::getParamX и B::getParamY вызывается метод A::validateParams, который гарантирует корректность типов для обоих методов.

Вопрос: какую аннотацию можно задать, чтобы заставить psalm корректно выводить типы с учетом вызова A::validateParams?
Если так сделать нельзя, то можно ли в месте вызова $this->getParamByKey указать возвращаемый тип из getParamByKey? Чтобы это выглядело как-то так:

public function getParamX(): string
{
return $this->getParamByKey('X'); /** @psalm-return string */
}

public function getParamY(): int
{
return $this->getParamByKey('Y'); /** @psalm-return int */
}

Тут конечно можно создать переменную, присвоить ей возвращаемое значение, а потом задать ей аннотацию / @var string $tmp /, только мне этот вариант не нравится, так как выглядит не очень красиво.

PHP задачи с собеседований
👎4
👨🏻‍💻 Удалить пробел из строки в переменной PHP

Есть такой кусок кода

$pric = $html->find('html body div span[class=price__value]', 0); // цена товара
$pric = strip_tags($pric); // обрезаю лишние хтмл теги

$pric = preg_replace('%^\s+|\s+$%u', '', $pric); // здесь должна быть цена без пробелов (но они есть)

Парсингом $html = new simple_html_dom(); вытаскиваю цену товара, но внутри цены присутствует пробел, в итоге у меня берет цифры до пробела (если тысячи) и нормально если пробела нет.

Для работы использую пхп 7.3

получаю 39 999

Использовал уже все известные регулярки, с различной кодировкой, без толку, не помогло ничего. Может кто подскажет решение проблемы? Кто сталкивался уже с таким

$pric = html_entity_decode($pric); 
echo $pric. "<br>";
$pric = preg_replace('% %u', '', $pric);
echo $pric. "<br>"; // выводим цену


и все остается так же как и было. Пробел на месте пы.сы. Из последнего, попробовал заменить пробел на "-", видит пробел в конце строки, а не в середине (между цифрами)

PHP задачи с собеседований