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

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

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, но я выбрал решение выше....

Cannot use object of type stdClass as array

При очередном написании скрипта на PHP, получил ошибку: Cannot use object of type stdClass as array, которая сообщает о невозможности использовать объект, как массив. То есть, я где то хочу получить значение из массива, который, на самом деле, не является массивом.

Смотрю по коду: Я использую функцию: json_decode, чтобы перевести JSON в массив:
$data = json_decode($data);

Логично, что дальше я могу писать так: $data['val'], чтобы работать со значением val... Я так думал, но нет...

Чтобы работать с $data['val'], необходимо использовать функцию: json_decode со вторым параметром. Второй параметр: true, и это служит для возврата ассоциативного массива, а не объекта:
$data = json_decode($data, true);

Ошибка исправлена!...

Как правильно писать функцию в обработчике события?

Для примера пишем функцию: display, так:
function display(param) {
	/* Code Function */
};

Или так:
var display = function(param) {
	/* Code Function */
};

Теперь пробуем вызывать функцию, при клике на ссылку (class="beginning"):
Первый вариант на jQuery:
$(document).on('click', 'a.beginning', () => {
	display('cover');
});

Первый вариант на чистом JS:
var beginning = document.querySelector('a.beginning');				
beginning.addEventListener('click',  function() {
	display('cover');
});

Или, второй вариант на jQuery:
$(document).on('click', 'a.beginning', display('cover'));

Второй вариант на чистом JS:
var beginning = document.querySelector('a.beginning');				
beginning.addEventListener('click', display('cover'));

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

Nginx: Как запретить прямое обращение к файлам

Для одной задумки потребовалось запретить прямое обращение к файлам, при этом, чтобы сценарий движка, мог иметь полный доступ, к файлам. Сделать это надо было на Nginx. Мне помогли с этим и сейчас расскажу, что необходимо сделать, чтобы запретить.

Папка для запрета: /app/XX/data/. Вместо XX идентификатор приложения, то есть цифры, которые постоянно меняются.

Код для конфига Nginx:
	location ~* /app/\d+/data/ {
		valid_referers server_names;
		if ($invalid_referer) {
			return 404;
		}
	}

Многие пишут return 403 (Запрещено), я решил, что будет лучше отправлять на 404 ошибку, нежели прямо давать понять, что сюда нельзя.

После добавления строк выше, необходимо перечитать конфигурацию. Для этого я использую команду:
nginx -s reload

Готово. Теперь папка data скрыта от прямого обращения.

Возможно, пригодится: Тема: Команды для настройки сервера....

jQuery: Как заменить класс у элемента

Для замены класса будем использовать две функции:
  • removeClass: Удаляет класс или классы, что были указанны.
  • addClass: Добавляет указанный класс элементу.

Допустим элемент div#taskInfo имеет класс displayNone, который нам необходимо заменить на displayInlineBlock:
<div id="taskInfo" class="displayNone"></div>

Делаем так:
$('#taskInfo').removeClass('displayNone').addClass('displayInlineBlock');

Предварительно стоит проверить наличие класса, что необходимо заменить:
if ($('#taskInfo').hasClass('displayNone')) {
	$('#taskInfo').removeClass('displayNone').addClass('displayInlineBlock');
};
...