Web Мастерская»Блог

Сообщество Web Мастеров. Тут собрано всё, чтобы написать свой первый сайт, запустить его в Интернет и поддерживать его в течении всей его работы.

Магический метод __call(): Вызов при недоступных методов

PHP
Магический метод __call() запускается при попытке обращения к несуществующему/недоступному методу:
	public function __call($name, $arguments)
	{
		echo 'Метод: ' . $name . ' не найден.';
	}

Мои два метода (installation и update) были похоже друг с другом, за исключением деталей, я решил их объединить, в один, при этом обращение к методам должно было остаться прежним:
$class->installation();
$class->update();

С решением этой задачи мне помог магический метод __call():
	// Установка | Обновление
	public function __call(string $name, array $arguments)
	{
		// Проверка: Если вызываемый метод не: installation, или не: update, то функция вернёт null 
		if (!in_array($name, ['installation', 'update']))
		{
			return null;
		}

		// Код функции
	} // End: Установка | Обновление
...

PHP: Цикл в две колонки | В два столбика

Работая над одним приложением, потребовалось перечислить элементы массива в две колонки (Столбика):



Для решения этой задачи, у меня было два варианта. Первый:
		<?php foreach ($characteristics as $characteristic): ?>
		<div class="feature">
			<?php echo $this->lang()->phrase($characteristic['name']); ?>: <strong><?php echo $characteristic['info']; ?></strong>
		</div>
		<?php endforeach; ?>

И CSS к шаблону:
.feature {
	display: inline-block;
	width: 48%;
}

И второй:
		<?php foreach ($characteristics as $key => $characteristic): ?>
		<?php if ($key % 2): ?>
		<div style="float: right;">
		<?php else: ?>
		<div style="float: left;">
		<?php endif; ?>
			<?php echo $this->lang()->phrase($characteristic['name']); ?>: <strong><?php echo $characteristic['info']; ?></strong>
		</div>
		<?php endforeach; ?>

Я выбрал первый вариант. Он мне показался лучшем, чем второй....

PHP: Дробное число без округления

PHP
В PHP есть функции: round | ceil | floor, которые округляют дробные числа, в большую или меньшую сторону, в зависимости от функции и самого числа. Удобно, да не всегда...

Бывает появляется необходимость работать с дробями, но не округляя их, а оставляя так, как есть. Нашёл такое решение:
$n = bcdiv('1762.789', 1, 2); // 1762.78

Кстати: Блог: Call to undefined function bcdiv().

Ещё вариант:
$n = floor(12.399 * 100) / 100; // 12.39
...

Call to undefined function bcdiv()

Для одной задачи, потребовалась функция: bcdiv, но, при её использовании, получил ошибку: Uncaught Error: Call to undefined function bcdiv().

В интернете найдено решение, выполнить команду:
sudo apt-get install php8.3-bcmath

Следует указать свою версию PHP....

PHP: Как составить из строки элемент массива

PHP
Стояла задача, составить из получаемой строки элемент массива. Допустим, есть такой массив:
$arr = [
	'k1' => [
		'k2' => [
			'k3' => [
				'k4' => 'v'
				]
			]
		]
];

Функция принимает строку: k1/k2/k3, используя данную строку, необходимо отдать элемент массива: $arr['k1']['k2']['k3'].

С решением помогли на Хабр:
<?php
$arr = [
	'k1' => [
		'k2' => [
			'k3' => [
				'k4' => 'v'
				]
			]
		]
];

$s = "k1/k2/k3";

$array = explode('/', $s);

foreach ($array as $v)
{
	$arr = $arr[$v];
}

Оказалось, всё просто! С каждой итерацией мы переходим к следующему "вложению" массива, подбираясь к нужному нам элементу.

Проверяем:
print_r($arr);

На экране видим:
['k4' => 'v']

А значит всё правильно.

Для решении мой задачи, так же, есть библиотека Array Dot Notation, но я выбрал решение выше....