Verification: a143cc29221c9be0

Php array filter with parameter

Фильтры в WordPress

Для создания фильтров используется функция:

add_filter( $hook_name, $function, $priority, $args_num )
$hook_name строка Название фильтра, для которого будет срабатывать функция.
$function строка Название функции (в виде строки), которая будет срабатывать. Если функция находится внутри класса, то нужно указать массив: array('название_класса', 'название_функции').
$priority число Приоритет выполнения функций для фильтра. Функция с приоритетом 20 будет выполняться после функции с приоритетом 10. По умолчанию приоритет равен 10.
$args_num число Количество принимаемых аргументов. Если фильтр может принимать два аргумента, то надо поставить цифру 2 и т.д (по умолчанию - 1).

После того как фильтр создан, его необходимо вызвать. Для этого используется:

apply_filters( $hook_name, $value, $args )
$hook_name строка Название фильтра, для которого будет срабатывать функция.
$value любой тип Значение, которое будет передано функции.
$args любой тип Дополнительные значение, которое будет передано функции.

Хуки должны иметь уникальные значения. И эти значения не должны совпадать с уже существующими хуками WordPress. И их более 2 000 (список хуков WordPress)

События в WordPress

Как сказали ранее, функции для работы с событиями аналогичны функциям работы с фильтрами. Аргументы совпадают.

Для добавления функции к событию используется "add_action":

add_action( $hook_name, $function, $priority, $args_num )

А чтобы запустить добавленные к событию функции необходимо выполнить:

do_action( $hook_name, $args )

Удаление хука в WordPress

Для удаления функции, которая привязана к фильтру или событию, используется несколько функций. Для событий - remove_action. Для функций - remove_filter. Обе функции принимают три аргумента. Первый - названия фильтра или события, второй - название привязанной функции, третий - приоритет удаления:

remove_action( $hook_name, $function, $priority )
remove_filter( $hook_name, $function, $priority )

Третий параметр очень важный. Если при добавлении функции был указан приоритет, то при удалении его тоже нужно указывать. Причём нужно использовать то же самое значение. Иначе удаления хука не произойдёт.

Попробуем модифицировать примеры из начала этой статьи, чтобы продемонстрировать удаление:

Теперь модифицируем второй пример, с двумя функциями на хуке. Но удалим только первую:

Инициализация

Чтобы использовать SQL ODM, создайте соединение SQL DB. Например:

$mapper = new \DB\SQL\Mapper(\DB\SQL $db, string $table [, array|string $fields = NULL [, int $ttl = 60 ]] )
 

Аргумент $fields позволяет указать только те поля , которые нужно отобразить. $fields представляет собой либо массив, либо список (в соответствии с функцией F3 split) имен столбцов, которые необходимо включить в mapper. По умолчанию для всех столбцов.

Когда $ttl! = 0, запускается проверка кэша для предыдущей схемы, и если срок ее действия истек или не найден, текущий результат сохраняется в бэкэнде кэша при условии, что система CACHE включена.

Eсли вы хотите создать класс модели, вы можете завершить его:

$f3->set('DB',new DB\SQL('sqlite:db/database.sqlite'));
 
class User extends \DB\SQL\Mapper {
	public function __construct() {
		parent::__construct( \Base::instance()->get('DB'), 'users' );
	}
}
 
$user = new User();
$user->load('id = 1');
// etc.

Синтаксис

$ filter

Аргумент $filter для SQL принимает следующую структуру:

  • строковое значение для простых строк where

string $whereClause
 
  • значение массива для параметризованных запросов

array ( string $whereClause [, string $bindValue1 [, string $bindValue2 [, ... ]]] )
 

Параметризованные запросы

Рекомендуется использовать параметризованные запросы для всех условий where, которые вводит пользователь.

Пример с параметром в виде вопросительного знака:

$mapper->load(array('username = ? and password = ? and deleted = 0','John','acbd18db4cc2f85cedef654fccc4a4d8'));

И с именованными параметрами:

$mapper->load(array(
	'username = :user and password = :pass and deleted = 0',
	':user'=>'John',':pass'=>'acbd18db4cc2f85cedef654fccc4a4d8'
));

Из-за ограничения PDO нельзя использовать именованный параметр более одного раза в запросе. Вам нужно создать 2 параметра :user1 и :user2 и передать им одинаковое значение.

В одном операторе SQL нельзя использовать и именованные параметры, и вопросительные знаки как параметры; выберите тот или иной вид параметра, но не смешивайте.

Тип данных, определяемый пользователем

Обычно тип данных определяется автоматически, но чтобы значение привязки было определенным типом PDO, используйте следующий синтаксис:

array(
	'prize > :prize and active = 1',
	':prize' => array(123, \PDO::PARAM_INT)
)
 

Когда вы используете оператор LIKE в условии where, обратите внимание, что знак % не входит в критерии where, но входит в параметр привязки следующим образом:

$user->find(array('email LIKE ?','%gmail%')); // returns all users with an email address at GMAIL

Полнотекстовый поиск

Если вы хотите выполнить полнотекстовый поиск ключевых слов по одному или нескольким полям в MySQL, вы можете использовать функцию MATCH AGAINST, которая выглядит так:

$text = 'some text';
$mapper->find(["MATCH (name,code) AGAINST (:search IN BOOLEAN MODE)", ':search' => $text ]);

Если вы также хотите отсортировать результаты по актуальности, вам нужно добавить это выражение соответствия как специальное поле, например:

$mapper->relevance = "MATCH (name,code) AGAINST (:search1 IN BOOLEAN MODE)";
$mapper->find(["MATCH (name,code) AGAINST (:search2 IN BOOLEAN MODE)", ':search1' => $text, ':search2' => $text ], ['order'=>'relevance desc']);

И если вы хотите сопоставить сразу несколько ключевых слов, вам нужно обернуть и экранировать ключевые слова

$mapper->find(["(MATCH(fieldA,fieldB) AGAINST('(".implode('") ("',$keywords).")' IN BOOLEAN MODE )"]);

или вставьте несколько заполнителей:

$mapper->find(["(MATCH(fieldA,fieldB) AGAINST('(?) (?) (?)' IN BOOLEAN MODE )", $a, $b, $c]);

$ option

$option для SQL принимает следующую структуру:

array(
	'order' => string $orderClause,
	'group' => string $groupClause,
	'limit' => integer $limit,
	'offset' => integer $offset
)
 

то есть:

array(
	'order' => 'score DESC, team_name ASC',
	'group' => 'score, player',
	'limit' => 20,
	'offset' => 0
)