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

Прислать задачу/вопрос в дар: @cyberJohnny
Сотрудничество: @cyberJohnny
Download Telegram
👨🏻‍💻 Ошибка 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 задачи с собеседований
👨🏻‍💻 Как сложить два равных по длине массива по индексам

Есть два массива

$arr = array([0] => 1,[1] => 2, [2] => 3 )

$arr1 = array([0] => 4,[1] => 5, [2] => 6 )

Размеры массивов могут меняться, но они всегда будут одинаковыми

Как сложить эти два массива с равными индексами чтобы на выходе получилось следующее

array([0] => 5,[1] => 7,[2] => 9)

PHP задачи с собеседований
👍3
👨🏻‍💻 У меня есть компонент news.list, в котором уже присутствует фильтрация новостей по свойству заданных тем. Как сделать еще одну фильтрацию для этого же компонента? Вот мой компонент news.list. В начале уже пытался вывести свойство.


<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Новости");

global $USER;
$filter = Array(
"IBLOCK_ID"=>$arParams["IBLOCK_ID"],
"ACTIVE"=>"Y",
"PROPERTY_SHOWLIST"=> $USER->GetID(),
);
$res = CIBlockElement::GetList(Array("SORT"=>"ASC"), $filter, false, false, Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM", "DETAIL_PAGE_URL"));

?>

<?
$themeId = intval($_GET['sel_theme']);
$themeFilter = array();
$themeCode = '';
$selectedThemeName = '';


if ($themeId > 0) {
$themeFilter["PROPERTY_THEME"] = $themeId;
} else if (isset($_GET['sel_theme'])) {
$themeCode = $_GET['sel_theme'];
$themeFilter = array('PROPERTY_THEME.CODE' => $themeCode);
$selectedThemeName = getThemeNameByCode($themeCode);
}

function getThemeNameByCode($themeCode) {
$theme = CIBlockElement::GetList(
array(),
array('CODE' => $themeCode),
false,
false,
array('ID', 'NAME')
)->Fetch();

if ($theme) {
return $theme['NAME'];
}

return false;
}


?>

<?$APPLICATION->IncludeComponent(
"bitrix:news.list",
"news.list",
array(
"ACTIVE_DATE_FORMAT" => "d.m.Y",
"ADD_SECTIONS_CHAIN" => "Y",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "Y",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "Y",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"CHECK_DATES" => "Y",
"DETAIL_URL" => "/news/detail/#ID#/",
"DISPLAY_BOTTOM_PAGER" => "Y",
"DISPLAY_DATE" => "Y",
"DISPLAY_NAME" => "Y",
"DISPLAY_PICTURE" => "Y",
"DISPLAY_PREVIEW_TEXT" => "Y",
"DISPLAY_TOP_PAGER" => "N",
"FIELD_CODE" => array(
0 => "",
1 => "",
),
"SELECTED_THEME_NAME" => $selectedThemeName,
"FILTER_NAME" => "themeFilter",
"HIDE_LINK_WHEN_NO_DETAIL" => "N",
"IBLOCK_ID" => "2",
"IBLOCK_TYPE" => "news",
"INCLUDE_IBLOCK_INTO_CHAIN" => "Y",
"INCLUDE_SUBSECTIONS" => "Y",
"MESSAGE_404" => "",
"NEWS_COUNT" => "4",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "Y",
"PAGER_TEMPLATE" => "pagination",
"PAGER_TITLE" => "Новости",
"PARENT_SECTION" => "",
"PARENT_SECTION_CODE" => "",
"PREVIEW_TRUNCATE_LEN" => "",
"PROPERTY_CODE" => array(
0 => "",
1 => "THEME",
2 => "SHOWLIST",
),
"SET_BROWSER_TITLE" => "Y",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "Y",
"SET_META_KEYWORDS" => "Y",
"SET_STATUS_404" => "N",
"SET_TITLE" => "Y",
"SHOW_404" => "N",
"SORT_BY1" => "ACTIVE_FROM",
"SORT_BY2" => "SORT",
"SORT_ORDER1" => "DESC",
"SORT_ORDER2" => "ASC",
"STRICT_SECTION_CHECK" => "N",
"COMPONENT_TEMPLATE" => "news.list"
),
false
);?>

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>

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

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